偏向锁、轻量级锁、重量级锁的理解 及适用场景

本文详细介绍了Java对象头与栈帧在锁机制中的作用,以及偏向锁和轻量级锁的工作原理。偏向锁适用于无锁竞争的场景,轻量级锁则在少量线程交替获取锁时提供更快的响应。锁升级过程不可逆,旨在提高效率。可通过JVM参数关闭偏向锁。两者各有优缺点,适用于不同的并发场景。
摘要由CSDN通过智能技术生成

对象头:synchronized用的锁是存在Java对象头里的。Java对象头里的Mark Word里默认存储对象的HashCode、分代年龄和锁标记位,主要用来表示对象的线程锁状态。

栈帧:也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。(我只能浅显的理解为是记录信息的,看了很多文章还是说不清楚)

 锁会随着线程的竞争情况逐渐升级,偏向锁 => 轻量级锁 => 重量级锁 。锁可以升级但是不能降级。升级的目的是为了提高获得锁和释放锁的效率。

偏向锁

当一个线程访问同步块获取锁时,会在对象头和栈帧的锁记录里存储锁偏向的线程ID,以后该线程再进入和推出同步块时不需要进行CAS(比较和交换,下次详细记录一下)操作来加锁和解锁。

通过判断对象头的Mark Word里面是否存有指向当前线程的偏向锁来决定是否需要使用CAS竞争锁。

适用场景:偏向锁只适合大部分锁没有被竞争的系统中(也可以说是只有一个线程访问同步块的场景),如果系统中存在大量被争用的锁时,会导致持有锁的线程不断切换,这时可以考虑关闭偏向锁。

可以通过JVM参数关闭偏向锁:

-XX:- UseBiasedLocking=false

,程序默认会进入轻量级锁状态。

轻量级锁

阻塞线程需要cpu从用户态转到内核态,代价比较大。而且可能会出现刚阻塞不久,锁就被释放的情况。为了缩小性能消耗,引入轻量级锁。

加锁

线程在执行同步块之前,JVM会先在当前线程的栈桢中创建用于存储锁记录的空间,并将对象头中的Mark Word复制到锁记录中,官方称为Displaced Mark Word。然后线程尝试使用 CAS将对象头中的Mark Word替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。

解锁

轻量级解锁时,会使用原子的CAS操作将Displaced Mark Word替换回到对象头,如果成功,则表示没有竞争发生。如果失败,表示当前锁存在竞争,锁就会膨胀成重量级锁。

适用场景:少量线程交替获取锁,同步块执行速度非常快的场景。追求响应时间。

优缺点对比

偏向锁   

          优:加锁/解锁不需要额外的消耗

          缺:有竞争时,会有额外的撤销锁或升级锁的消耗

轻量级锁

           优:竞争的线程不会被阻塞(采用自旋),提高了程序的响应速度

            缺:始终得不到锁的线程一直自旋会消耗cpu,造成cpu浪费(自旋好像就是无实际意义的循环,可以设定一个自旋等待的最大时间)

重量级锁

           优:线程竞争不使用自旋,线程竞争锁失败后会阻塞,cpu的消耗会减少,增大了数据的吞吐量

            缺:线程阻塞,响应速度慢

适用场景:大量线程同时竞争锁,追求吞吐量。

轻量级重量级偏向锁Java中的三种不同的机制。轻量级是一种乐观,用于在多线程环境下提高并发性能。当竞争不激烈时,轻量级使用CAS(Compare and Swap)操作来获取,避免了线程阻塞,提升了性能。然而,如果竞争激烈,轻量级会膨胀为重量级偏向锁是在没有竞争的情况下,为了进一步提高性能而引入的机制。偏向锁允许第一个获得的线程在接下来的执行中,无需再进行同步操作,从而减少了不必要的竞争。当有其他线程试图获取偏向锁时,偏向锁会升级为轻量级重量级重量级是一种传统的互斥,它使用操作系统原语(例如互斥量)来实现线程阻塞和唤醒,确保同一时间只有一个线程可以访问被定的资源。重量级适用竞争激烈的场景,但由于涉及到内核态和用户态之间的切换,会带来较大的性能开销。 总结起来,轻量级偏向锁都是为了提高并发性能而引入的机制,轻量级适用竞争不激烈的场景,而偏向锁适用于没有竞争的情况下。重量级适用竞争激烈的场景,但会带来较大的性能开销。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [浅谈偏向锁轻量级重量级](https://blog.csdn.net/yaojiqic/article/details/124619021)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Java中的偏向锁轻量级重量级解析](https://blog.csdn.net/lengxiao1993/article/details/81568130)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java的升级策略 偏向锁 轻量级 重量级](https://download.csdn.net/download/weixin_38512659/12749004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值