`

(转)Java偏向锁实现原理(Biased Locking)

阅读更多

http://www.iteye.com/topic/518066

 

阅读本文的读者,需要对Java 轻量级锁有一定的了解,知道lock record, mark word之类的名词。可以参考我的一篇博文:Java 轻量级锁原理详解(Lightweight Locking)

Java 偏向锁(Biased Locking)是Java6引入的一项多线程优化。它通过消除资源无竞争情况下的同步原语,进一步提高了程序的运行性能。

轻量级锁也是一种多线程优化,它与偏向锁的区别在于,轻量级锁是通过CAS来避免进入开销较大的互斥操作,而偏向锁是在无竞争场景下完全消除同步,连CAS也不执行(CAS本身仍旧是一种操作系统同步原语,始终要在JVM与OS之间来回,有一定的开销)。

所谓的无竞争场景,举个例子,就是单线程访问带同步的资源或方法。

 

偏向锁实现原理

偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在接下来的运行过程中,该锁没有被其他的线程访问,则持有偏向锁的线程将永远不需要触发同步。
如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会尝试消除它身上的偏向锁,将锁恢复到标准的轻量级锁。(偏向锁只能在单线程下起作用)

通过下图可以更直观的理解偏向锁:

这张图,省略了轻量级锁相关的几处步骤,将关注点更多地聚焦在偏向锁的状态变化上。
偏向模式和非偏向模式 ,在下面的mark word表中,主要体现在thread ID字段是否为空。

挂起持有偏向锁的线程 ,这步操作类似GC的pause,但不同之处是,它只挂起持有偏向锁的线程(非当前线程)。

在抢占模式的橙色区域说明中有提到,指向当前堆栈中最近的一个lock record(在轻量级锁原理一文有讲到,lock record是进入锁前会在stack上创建的一份内存空间)。
这里提到的最近的一个lock record,其实就是当前锁所在的stack frame上分配的lock record。
整个步骤是从偏向锁恢复到轻量级锁的过程。

偏向锁也会带来额外开销

在JDK6中,偏向锁是默认启用的。它提高了单线程访问同步资源的性能。
但试想一下,如果你的同步资源或代码一直都是多线程访问的,那么消除偏向锁这一步骤对你来说就是多余的。事实上,消除偏向锁的开销还是蛮大的。

所以在你非常熟悉自己的代码前提下,大可禁用偏向锁 -XX:-UseBiasedLocking

分享到:
评论

相关推荐

    Biased Locking in HotSpot - Dave - 2006.pdf

    知识点一:偏向锁(Biased Locking)的起源 偏向锁的概念源自于一篇由Dave、Mark Moir和Bill Scherer共同撰写的论文。作者们指出,传统的Java监控锁(即synchronized锁)在执行CAS操作(比较并交换)时会带来显著的...

    Biased Locking in HotSpot

    HotSpot虚拟机作为Java平台的主流虚拟机之一,提供了多种锁优化策略,其中之一就是“偏见锁”(Biased Locking)。本文将深入探讨HotSpot中的偏见锁机制,以及它如何提高并发性能。 偏见锁是一种针对轻量级锁的优化...

    JAVA锁优化和膨胀过程.docx

    这些技术包括自适应自旋(Adaptive Spinning)、锁删除(Lock Elimination)、锁膨胀(Lock Coarsening)、轻量级锁(Lightweight Locking)和偏向锁(Biased Locking)。 自适应自旋是一种技术,通过多次尝试,...

    顶尖的Java多线程、锁、内存模型面试题!.docx

    - **偏向锁(Biased Locking):** 当一个对象被首次锁定时,JVM 使用偏向锁。在这种模式下,对象头被设置为指向当前持有锁的线程。如果之后没有其他线程试图获取该锁,那么该线程就可以无锁地访问对象。这减少了无...

    并发面试专题.docx

    Synchronized 相关问题 Synchronized 是 Java 语言中的一种实现...现代 JDK 中做了大量的优化,包括使用自旋锁、偏向锁(Biased Locking)、轻量级锁、重量级锁等,这些优化使得 JDK 能够优化 Synchronized 的运行。

    第16讲synchronized底层如何实现?什么是锁...1

    1. **偏斜锁(Biased Locking)**:在没有竞争的情况下,synchronized会尝试使用偏斜锁,这是一种优化策略。JVM会在对象头的Mark Word中存储当前线程ID,表示对象偏向于该线程。如果只有一个线程访问,避免了锁的...

    第16讲 synchronized底层如何实现?什么是锁的升级、降级?1

    1. **偏斜锁(Biased Locking)**:默认情况下,当一个对象被创建时,JVM 会尝试让该对象偏向于第一个获得锁的线程。这意味着如果同一个线程多次请求同一对象的锁,它可以快速获取而不需进行任何同步操作。偏斜锁...

    java并发编程综合讲解

    - **偏向锁(Biased Locking)**:当一个线程连续持有锁时,可以优化为偏向锁,减少锁状态转换的开销。 - **适应性⾃旋(Adaptive Spinning)**:根据系统负载动态调整自旋等待的时间,以平衡锁等待和上下文切换的...

    高并发多线程面试专题及答案(上).pdf

    - 偏向锁(Biased Locking):偏向锁通过在Mark Word中记录持有偏向锁的线程ID来避免实际的锁操作,适用于一个线程多次访问同一个锁的场景。 - 轻量级锁:轻量级锁通过CAS(Compare And Swap)操作尝试获取锁,并在...

    Java分布式应用学习笔记03JVM对线程的资源同步和交互机制

    2. **偏向锁(Biased Locking)**:这是一种轻量级的锁机制,用于减少无竞争情况下的同步开销。当一个线程首次访问一个对象的锁时,JVM会尝试使用偏向锁。如果在后续的访问中没有其他线程竞争,那么这个线程就可以...

    锁优化技术分享.pdf

    - **锁偏向(Biased Locking)**:当锁不存在竞争时,偏向于已获取锁的线程,减少同步开销。可使用`-XX:-UseBiasedLocking=false`禁用。 9. **并发工具类** Java提供多种并发工具类,如Semaphore用于限制同时访问...

    深入理解Java虚拟机笔记(带目录).docx

    * 使用偏向锁机制(Biased Locking):让线程在锁竞争时停在安全点上。 垃圾收集器 Java 中的垃圾收集器有以下几种: * Serial 垃圾收集器:单线程的垃圾收集器。 * Parallel 垃圾收集器:多线程的垃圾收集器。 *...

    浅谈Java虚拟机对内部锁的四种优化方式

    3. **偏向锁(Biased Locking)** 偏向锁是一种优化策略,适用于大多数情况下只有一个线程访问同步块的情况。当一个线程进入同步块并获得锁时,JVM会在对象头中记录这个线程的标识,之后只要这个线程再次尝试获取该...

    jvm细节探索之synchronized及实现问题分析

    4. 偏向锁(Biased Locking):在无锁竞争时,减少CAS操作,提高单线程场景下的性能。 5. 适应性自旋(Adaptive Spinning):在尝试获取轻量级锁失败时,线程会自旋一段时间,若仍未获取则进入阻塞状态,减少不必要...

    JVM基础JVM基础JVM基础

    Java中的锁机制主要有两种:偏向锁(Biased Locking)、轻量级锁(Lightweight Locking)和重量级锁(Heavyweight Locking)。此外,Java还提供了各种同步机制来确保多线程环境下的数据安全性,如synchronized关键字、...

    jvm-anatomy-park-complete

    例如,禁用偏向锁定(Biased Locking)是测试中常见的一步。偏向锁定是Hotspot虚拟机中的一种机制,用于提高单线程锁操作的性能。但是在多线程环境下或者在测试锁性能时,它可能会引入不确定的变数,因此在进行基准...

Global site tag (gtag.js) - Google Analytics