首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

偏向锁升级为轻量级锁

偏向锁升级为轻量级锁的基础概念

在Java的并发编程中,锁机制是确保多线程环境下数据一致性和线程安全的关键。Java虚拟机(JVM)提供了多种锁优化机制,其中包括偏向锁、轻量级锁和重量级锁。

偏向锁:偏向锁是一种优化机制,旨在减少无竞争情况下的锁开销。当一个线程首次访问某个对象的同步块时,JVM会将对象头中的标记字段设置为偏向该线程的ID。如果后续该线程再次访问该同步块,则可以直接进入,无需进行任何同步操作。

轻量级锁:轻量级锁是在偏向锁的基础上进一步优化的机制。当多个线程竞争同一个对象的锁时,偏向锁会升级为轻量级锁。轻量级锁通过CAS(Compare and Swap)操作来尝试获取锁,避免了操作系统级别的线程阻塞和唤醒,从而减少了上下文切换的开销。

升级原因

偏向锁升级为轻量级锁的主要原因是存在多线程竞争。具体来说,当以下情况发生时,偏向锁会升级为轻量级锁:

  1. 多个线程竞争同一对象的锁:当有多个线程同时尝试获取同一个对象的锁时,偏向锁无法满足需求,因为偏向锁只允许一个线程持有锁。
  2. 锁撤销:当一个线程持有偏向锁,而另一个线程尝试获取该锁时,JVM需要进行锁撤销操作,将偏向锁升级为轻量级锁。

升级过程

  1. 检测竞争:JVM会检测是否有其他线程正在竞争该对象的锁。
  2. 撤销偏向锁:如果有竞争,JVM会撤销偏向锁,并将对象头中的标记字段设置为无锁状态。
  3. 尝试获取轻量级锁:当前线程会尝试通过CAS操作获取轻量级锁。如果成功,则持有锁;如果失败,则表示有其他线程持有锁,当前线程会自旋等待或升级为重量级锁。

应用场景

偏向锁和轻量级锁主要应用于以下场景:

  • 低竞争环境:在大多数情况下,偏向锁可以显著减少锁的开销,提高程序性能。
  • 中等竞争环境:当存在一定程度的线程竞争时,轻量级锁可以通过CAS操作减少上下文切换的开销。

示例代码

以下是一个简单的Java示例,展示了偏向锁和轻量级锁的使用:

代码语言:txt
复制
public class LockExample {
    private static final Object lock = new Object();

    public static void main(String[] args) {
        // 偏向锁示例
        synchronized (lock) {
            System.out.println("偏向锁执行");
        }

        // 轻量级锁示例
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("轻量级锁线程1执行");
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("轻量级锁线程2执行");
            }
        });

        t1.start();
        t2.start();
    }
}

在这个示例中,第一个synchronized块使用偏向锁,因为只有一个线程访问同步块。第二个和第三个synchronized块使用轻量级锁,因为有两个线程竞争同一个对象的锁。

解决常见问题

如果在实际应用中遇到偏向锁升级为轻量级锁的问题,可以考虑以下几点:

  1. 减少锁的粒度:尽量减少同步块的范围,只对必要的代码块进行同步。
  2. 使用并发集合:对于常见的并发操作,可以使用Java提供的并发集合类(如ConcurrentHashMap),这些类内部已经进行了优化,可以减少锁的使用。
  3. 避免长时间持有锁:尽量减少线程持有锁的时间,避免其他线程长时间等待。

通过以上方法,可以有效减少偏向锁升级为轻量级锁的频率,提高程序的性能和稳定性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

锁升级:无锁、偏向锁、轻量级锁、重量级锁

并且四种状态会随着竞争的情况逐渐升级,而且是不可逆的过程,即不可降级,这四种锁的级别由低到高依次是:无锁、偏向锁,轻量级锁,重量级锁。如下图所示: ?...如果线程不处于活动状态,则将对象头设置成无锁状态,并撤销偏向锁,恢复到无锁(标志位为01)或轻量级锁(标志位为00)的状态。...轻量级锁 轻量级锁是指当锁是偏向锁的时候,却被另外的线程所访问,此时偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,线程不会阻塞,从而提高性能。...轻量级锁的获取主要由两种情况: 当关闭偏向锁功能时; 由于多个线程竞争偏向锁导致偏向锁升级为轻量级锁。 一旦有第二个线程加入锁竞争,偏向锁就升级为轻量级锁(自旋锁)。...如果锁竞争情况严重,某个达到最大自旋次数的线程,会将轻量级锁升级为重量级锁(依然是CAS修改锁标志位,但不修改持有锁的线程ID)。

3.2K20

详解synchronized和锁升级,以及偏向锁和轻量级锁的升级

锁的优化 锁的 4 中状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态(级别从低到高),整个锁的状态从低到高变化的过程被称为所升级。 为什么要引入偏向锁?...(线程 1)的栈帧信息,如果还是需要继续持有这个锁对象」,那么暂停当前线程 1,撤销偏向锁,升级为轻量级锁,如果线程 1 不再使用该锁对象,那么将锁对象状态设为无锁状态,重新偏向新的线程。...轻量级锁什么时候升级为重量级锁?...重量级锁把除了拥有锁的线程都阻塞,防止 CPU 空转。」 ❝ 注意:为了避免无用的自旋,轻量级锁一旦膨胀为重量级锁就不会再降级为轻量级锁了;偏向锁升级为轻量级锁也不能再降级为偏向锁。...一句话就是锁可以升级不可以降级,但是偏向锁状态可以被重置为无锁状态。

91030
  • synchronized偏向锁和轻量级锁_java轻量级锁,偏向锁,重量级锁

    今天简单了解了一下java轻量级锁和重量级锁以及偏向锁。...自旋是在轻量级锁中使用的 轻量级锁 轻量级锁提升程序同步性能的依据是:对于绝大部分的锁,在整个同步周期内都是不存在竞争的(区别于偏向锁)。这是一个经验数据。...轻量级锁的加锁过程: 在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间...偏向所锁,轻量级锁及重量级锁 偏向所锁,轻量级锁都是乐观锁,重量级锁是悲观锁。 一个对象刚开始实例化的时候,没有任何线程来访问它的时候。...,然后重新偏向新的线程,如果原来的线程依然存活,则马上执行那个线程的操作栈,检查该对象的使用情况,如果仍然需要持有偏向锁,则偏向锁升级为轻量级锁,(偏向锁就是这个时候升级为轻量级锁的)。

    49230

    解锁疑惑:偏向锁为什么不是锁?锁升级又是发生的?何时禁用偏向锁和轻量级锁?

    今天我们来聊聊Java中的锁!synchronized怎么用?锁是什么?偏向锁是什么?锁如何升级?何为膨胀?自旋锁何解?互斥锁怎么来的?何时要禁用偏向锁和轻量级锁?...Length数组的长度(当对象为数组时)从上表中,我们可以看到,锁相关的信息,是存在称之为Markword中的内存域中。...hashage001 从上面Markword的结构中,可以看出 所有新创建的对象,都是可偏向的(锁标志位为01),但都是未偏向的(是否偏向锁标志位为0)偏向锁当线程执行到临界区(critical section...此时可能就要根据另外线程的情况,可能是重新偏向,也有可能是做偏向撤销,但大部分情况下就是升级成轻量级锁了。...下篇预告在上面,我们说到,一旦出现竞争,也即有另外一个线程也要来访问这一段代码,偏向锁就不适用于这种场景了。如何解决的呢?下篇文章将带大家了解锁膨胀、锁撤销、轻量级锁等内容!

    11210

    synchronized偏向锁和轻量级锁_偏向锁轻量级锁重量级锁的原理

    今天简单了解了一下java轻量级锁和重量级锁以及偏向锁。...自旋是在轻量级锁中使用的 轻量级锁 轻量级锁提升程序同步性能的依据是:对于绝大部分的锁,在整个同步周期内都是不存在竞争的(区别于偏向锁)。这是一个经验数据。...轻量级锁的加锁过程: 在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间...偏向所锁,轻量级锁及重量级锁 偏向所锁,轻量级锁都是乐观锁,重量级锁是悲观锁。 一个对象刚开始实例化的时候,没有任何线程来访问它的时候。...,然后重新偏向新的线程,如果原来的线程依然存活,则马上执行那个线程的操作栈,检查该对象的使用情况,如果仍然需要持有偏向锁,则偏向锁升级为轻量级锁,(偏向锁就是这个时候升级为轻量级锁的)。

    24620

    一文打通锁升级(偏向锁,轻量级锁,重量级锁)

    但是在JavaSE1.6的时候,对synchronized进行了优化,引入了偏向锁和轻量级锁,以及锁的存储结构和升级过程,减少了获取锁和释放锁的性能消耗,有些情况下它也就不那么重了。...一旦有第二个线程加入锁竞争,偏向锁就升级为轻量级锁(自旋锁)。...升级为轻量级锁的时候需要撤销偏向锁,撤销偏向锁的时候会导致STW(stop the word)操作; 实际上偏向锁在JDK1.6之后是默认开启的,但是启动时间有延迟(4秒), 所以需要添加参数-XX...升级时机:当关闭偏向锁功能或多线程竞争偏向锁会导致偏向锁升级为轻量级锁 假如线程A已经拿到锁,这时线程B又来抢该对象的锁,由于该对象的锁已经被线程A拿到,当前该锁已是偏向锁了。...,A线程Over,B线程上位; 如果锁获取失败,则偏向锁升级为轻量级锁(设置偏向锁标识为0并设置锁标志位为00),此时轻量级锁由原持有偏向锁的线程持有,继续执行其同步代码,而正在竞争的线程B会进入自旋等待获得该轻量级锁

    36930

    Synchronized 偏向锁、轻量级锁、自旋锁、锁消除

    随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级)。...1、轻量级锁的加锁过程   (1)在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record...当到达全局安全点(safepoint)时获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行同步代码。   (5)执行同步代码。...偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,判断锁对象是否处于被锁定状态,撤销偏向锁后恢复到未锁定(标志位为“01”)或轻量级锁(标志位为“00”...五、总结   本文重点介绍了JDk中采用轻量级锁和偏向锁等对Synchronized的优化,但是这两种锁也不是完全没缺点的,比如竞争比较激烈的时候,不但无法提升效率,反而会降低效率,因为多了一个锁升级的过程

    82210

    Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)

    在现在的版本中,锁的状态总共有四种: 无锁状态 偏向锁 轻量级锁 重量级锁 很显然锁的“重量”从左到右,依次递增 无所状态很好理解,新增加的偏向锁与轻量级锁,其实就是尽可能的将重量级锁往“无锁”的方向靠拢...(你简单理解为一个结构体,每个字段都有空间表示也不影响理解此处的叙述) 锁标志位(什么类型的锁),他的标志包括:无锁、轻量级锁、重量级锁、偏向锁 轻量级锁时会记录:指向栈中锁记录的指针 重量级锁时会记录...ID,对于同一线程,如果无锁状态获取偏向锁成功或者是偏向锁,且为该线程,后续的进出无需额外的同步操作: 但是一旦出现竞争,那么就会进行锁升级,升级为轻量级锁 小结 轻量级锁和偏向锁都是借助于CAS...,如果出现问题,将会进行锁的升级,升级是不可逆的,也就是说只能从低到高,也就是偏向-->轻量级-->重量级,不能够降级 偏向锁是对于轻量级锁的更进一步优化,当然这是有前提的,那就是“场景” 很显然,...对于偏向锁和轻量级锁,如果不是同一线程或者线程竞争激烈,将会迅速的从偏向锁升级为轻量级锁,然后迅速变为重量级锁,而偏向锁和轻量级锁带来的一切开销,都将是额外的开销,所以二者的开启与否要根据业务来,不同版本的

    1K20

    浅谈偏向锁、轻量级锁、重量级锁

    使用内置锁能够简化并发模型;随着JVM的升级,几乎不需要修改代码,就可以直接享受JVM在内置锁上的优化成果。从简单的重量级锁,到逐渐膨胀的锁分配策略,使用了多种优化手段解决隐藏在内置锁下的基本问题。...使用轻量级锁时,不需要申请互斥量,仅仅将Mark Word中的部分字节CAS更新指向线程栈中的Lock Record,如果更新成功,则轻量级锁获取成功,记录锁状态为轻量级锁;否则,说明已经有线程获得了轻量级锁...“偏向”的意思是,偏向锁假定将来只有第一个申请锁的线程会使用锁(不会有任何线程再来申请锁),因此,只需要在Mark Word中CAS记录owner(本质上也是更新,但初始值为空),如果记录成功,则偏向锁获取成功...,记录锁状态为偏向锁,以后当前线程等于owner就可以零成本的直接获得锁;否则,说明有其他线程竞争,膨胀为轻量级锁。...偏向锁无法使用自旋锁优化,因为一旦有其他线程申请锁,就破坏了偏向锁的假定。 缺点 同样的,如果明显存在其他线程申请锁,那么偏向锁将很快膨胀为轻量级锁。 不过这个副作用已经小的多。

    56620

    Java锁---偏向锁、轻量级锁、自旋锁、重量级锁

    当到达全局安全点(safepoint)时获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行同步代码。...偏向锁的适用场景 始终只有一个线程在执行同步块,在它没有执行完释放锁之前,没有其它线程去执行同步块,在锁无竞争的情况下使用,一旦有了竞争就升级为轻量级锁,升级为轻量级锁的时候需要撤销偏向锁,撤销偏向锁的时候会导致...轻量级锁是由偏向所升级来的,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁;  轻量级锁的加锁过程: 在代码进入同步块的时候,如果同步对象锁状态为无锁状态...如果不是,则使用CAS将当前线程的ID替换Mard Word,如果成功则表示当前线程获得偏向锁,置偏向标志位1  3. 如果失败,则说明发生竞争,撤销偏向锁,进而升级为轻量级锁。  4....,没有其它线程会执行该同步块,一旦有了第二个线程的争用,偏向锁就会升级为轻量级锁,如果轻量级锁自旋到达阈值后,没有获取到锁,就会升级为重量级锁; 如果线程争用激烈,那么应该禁用偏向锁。

    2.1K30

    锁的升级打怪:通俗易懂讲解偏向锁、轻量级锁和重量级锁

    老大说,这叫偏向锁,在没有别的线程竞争的时候,一直偏向我,可以让我一直执行下去。 我是多么期盼来一个新的线程来和我竞争啊! 轻量级锁 很快,机会就来了。...但是老大还是不去操作系统协商,只是说: 我把这个偏向锁升级一下,变成一个轻量级的锁吧。...这时候JVM老大说: 自旋次数太多了,太浪费CPU了,接下来升级为重量级锁! 这个重量级锁需要操作系统的帮忙,依赖操作系统底层的Mutex Lock。...锁升级了! ? 由于0x3704还在持有锁运行,而我终于进入了梦寐以求的状态:阻塞! 终于可以休息一下了!...仔细一想,老大煞费心机地设置了偏向锁和轻量级锁,就是为了避免阻塞,避免操作系统的介入, 这两种锁无非就是针对这两种情况: 偏向锁: 通常只有一个线程在临界区执行 轻量级锁: 可以有多个线程交替进入临界区

    1.7K30

    解锁疑惑:偏向锁为什么不是锁?锁升级又是什么?何时禁用偏向锁和轻量级锁?重量级锁怎么回事?

    今天我们继续来聊聊Java中的锁!解"锁"疑惑:偏向锁为什么不是锁?锁升级又是发生的?何时禁用偏向锁和轻量级锁?synchronized怎么用?锁是什么?偏向锁是什么?锁如何升级?何为膨胀?...锁膨胀如果两个线程都是活跃的,会发生竞争,此时偏向锁就会发生升级,也就是我们常常听到的锁膨胀。 偏向锁会膨胀成轻量级锁(lightweight locking)。...锁撤销偏向锁有一个不好的点就是,一旦出现多线程竞争,需要升级成轻量级锁,是有可能需要先做出锁撤销的操作。...当然,升级成互斥锁之后,锁对象头的Markword内容也是会变化的,其内容如下: bit fields锁标志位指向Mutex的指针10每次检查当前线程是否获得锁,其实就是检查Mutex的值是否为0,不为...当使用synchronized关键字的时候,在java1.6之后,根据不同的条件和场景,虚拟机是一步一步地将偏向锁升级成轻量级锁,再最终升级成重量级锁的,而这个过程是不可逆的,因为一旦升级成重量级锁,则说明偏向锁和轻量级锁是不适用于当前的应用场景的

    9010

    Java Concurrent 偏向锁&轻量级锁&重量级锁

    image.png 在Java SE1.6 以上里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。...注意一点:锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。...当到达全局安全点(safepoint)时获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行同步代码。 5)执行同步代码。...CAS更新对象头 3)争夺轻量级锁失败时,自旋尝试抢占锁 加锁过程: 1)在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),JVM首先将在当前线程的栈帧中建立一个名为...相较于轻量级来说最大区别应该是不进行自旋操作,直接阻塞, 总结 轻量级锁是为了在线程交替执行同步块时提高性能,而偏向锁则是在只有一个线程执行同步块时进一步提高性能,重量级锁是为处理常存在多线程竞争,同步块执行时间十分长的情况下的锁的方式

    75020

    引入偏向锁和轻量级锁的好处

    引入偏向锁的好处偏向锁的好处是并发度很低的情况下,同一个线程获取锁不需要内存拷贝的操作,免去了轻量级锁的在线程栈中建LockRecord,拷贝MarkDown的内容。...另外Hotspot也做了另一项优化,基于锁对象的epoch批量偏移和批量撤销偏移,这样大大降低了偏向锁的CAS和锁撤销带来的损耗。...因为基于epoch批量撤销偏向锁和批量加偏向锁能大幅提升吞吐量,但是并发量特别大的时候性能就没有什么特别的提升了。偏向锁减少CAS操作,降低Cache一致性流量,CAS操作会延迟本地调用。...所以偏向锁比较适用于只有一个线程访问同步块场景。引入轻量级的好处对于绝大部分的锁,在整个同步周期内都是不存在竞争的。如果没有竞争,轻量级锁通过CAS操作成功,避免了使用互斥量的开销。...如果确实存在锁竞争,始终得不到锁竞争的线程使用自旋会消耗CPU,除了互斥量的本身开销外,还额外发生了CAS操作的开销,轻量级锁反而会比传统的重量级锁更慢。

    7010

    12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁

    老王:这个时候就有锁的竞争了,这就需要将锁升级一下了,线程B就会把锁升级为轻量级锁? 偏向锁为什么要升级为轻量级锁? 小陈:为啥啊,都使用偏向锁不行吗?不升级有什么坏处?...老王:了解了轻量级加锁的原理之后,我们继续,来讲讲偏向锁升级为轻量级锁的过程: (1)首先线程A持有偏向锁,然后正在执行synchronized块中的代码 (2)这个时候线程B来竞争锁,发现有人加了偏向锁并且正在执行...的数据复制到锁记录中;然后将锁记录放入线程A的虚拟机栈中 (4)然后将Mark Word中的前30位指向线程A中锁记录的地址,将线程A唤醒,线程A就知道自己持有了轻量级锁 老王:上面就是偏向锁升级为轻量级锁的过程...(再重新看一遍) 小陈:老王,你说的这个偏向锁升级轻量级锁的过程我看懂了... 小陈:老王啊,上面偏向锁升级为轻量级锁的过程和原理我了解了,那在轻量级锁模式下,多线程是怎么竞争锁和释放锁的?...于是就升级为轻量级锁,在轻量级锁模式在每次加锁和释放是都需要执行CAS操作,对比偏向锁来说性能低一点的,但是总体还是比较轻量级的。

    60320

    偏向锁、轻量级锁、重量级锁、自旋锁原理讲解

    偏向锁的获取流程: (1)查看Mark Word中偏向锁的标识以及锁标志位,若是否偏向锁为1且锁标志位为01,则该锁为可偏向状态。...(4)当前线程通过CAS竞争锁失败的情况下,说明有竞争。当到达全局安全点时之前获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行同步代码。...偏向锁的撤销需要等待全局安全点(即没有字节码正在执行),它会暂停拥有偏向锁的线程,撤销后偏向锁恢复到未锁定状态或轻量级锁状态。...四、轻量级锁 轻量级锁不是用来替代传统的重量级锁的,而是在没有多线程竞争的情况下,使用轻量级锁能够减少性能消耗,但是当多个线程同时竞争锁时,轻量级锁会膨胀为重量级锁。...轻量级锁的加锁过程: (1)当线程执行代码进入同步块时,若Mark Word为无锁状态,虚拟机先在当前线程的栈帧中建立一个名为Lock Record的空间,用于存储当前对象的Mark Word的拷贝,官方称之为

    10.5K65

    偏向锁、轻量级锁、重量级锁、自旋锁、自适应自旋锁

    如果明显存在其他线程申请锁,那么偏向锁将很快膨胀为轻量级锁。如果需要,使用参数-XX:-UseBiasedLocking禁止偏向锁优化(默认打开)。 ?...1.1 偏向锁获取过程 查看Mark Word中偏向锁的标识以及锁标志位,若是否为偏向锁为1,并且锁标志位为01,则该锁为可偏向状态。...持有偏向锁状态的线程在没有字节码正在执行的情况下释放锁,然后恢复到未锁定状态或者膨胀为轻量级锁。 ?...持有持有偏向锁的线程需要等到所有的同步任务执行完成之后(即没有字节码正在执行),才会暂停持有偏向锁的线程,然后恢复到未锁定状态或者膨胀为轻量级锁。...1.1 轻量级锁获取过程 当线程执行代码进入同步块时,若Mark Word锁标识为无锁状态(是否为偏向锁为0,锁标志位为01),虚拟机会在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间

    4.4K10

    synchronized偏向锁和轻量级锁_线程synchronized用法

    今天简单了解了一下java轻量级锁和重量级锁以及偏向锁。...自旋是在轻量级锁中使用的 轻量级锁 轻量级锁提升程序同步性能的依据是:对于绝大部分的锁,在整个同步周期内都是不存在竞争的(区别于偏向锁)。这是一个经验数据。...轻量级锁的加锁过程: 在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间...偏向所锁,轻量级锁及重量级锁 偏向所锁,轻量级锁都是乐观锁,重量级锁是悲观锁。 一个对象刚开始实例化的时候,没有任何线程来访问它的时候。...,然后重新偏向新的线程,如果原来的线程依然存活,则马上执行那个线程的操作栈,检查该对象的使用情况,如果仍然需要持有偏向锁,则偏向锁升级为轻量级锁,(偏向锁就是这个时候升级为轻量级锁的)。

    22120

    Java 并发编程:轻量级锁和偏向锁详解

    随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级)。...JDK 1.6中默认是开启偏向锁和轻量级锁的,我们也可以通过-XX:-UseBiasedLocking来禁用偏向锁。锁的状态保存在对象的头文件中,以32位的JDK为例: ?...1、轻量级锁的加锁过程 (1)在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record...当到达全局安全点(safepoint)时获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行同步代码。 (5)执行同步代码。...偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,判断锁对象是否处于被锁定状态,撤销偏向锁后恢复到未锁定(标志位为“01”)或轻量级锁(标志位为“00”

    1.8K31

    【Java 并发编程】线程锁机制 ( 锁的四种状态 | 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 | 锁竞争 | 锁升级 )

    , 无锁 , 偏向锁 , 轻量级锁 , 重量级锁 ; 三、锁的四种状态 ( 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 ) ---- Java 虚拟机堆内存中的对象数据中 , 每个对象都有一个对象头..., 持有偏向锁的线程会 释放该偏向锁 , 并添加轻量级锁 ; 锁竞争 : 多个线程尝试获取同一个锁 ; 没有竞争 : 如果每次获取都很顺利 , 没有出现阻塞 , 则没有竞争 ; 有竞争 : 如果线程尝试获取锁..., 只是给单线程执行加了层保险 , 如果没有线程竞争该锁 , 则正常执行 , 如果有线程竞争 , 则将偏向锁升级为轻量级锁 ; 轻量级锁 : 自旋锁 , 等待期间一直做自旋操作 , 效率较高 , 但是空耗..., 无锁 ; 无锁 -> 偏向锁 : 第 1 个线程访问共享资源时 , 无锁状态升级为偏向锁 ; 偏向锁 -> 轻量级锁 : 第 2 个线程再来访问 共享资源 时 , 偏向锁 升级为...轻量级锁 ; 轻量级锁 -> 重量级锁 : 如果 自旋线程数 超过 CPU 核数一半 , 或 单个线程超过 10 次自旋 , 自动将锁升级为重量级锁 ;

    87710
    领券