Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群17
Java1234官方群25:838462530
        
SpringBoot+SpringSecurity+Vue+ElementPlus权限系统实战课程 震撼发布        

最新Java全栈就业实战课程(免费)

springcloud分布式电商秒杀实战课程

IDEA永久激活

66套java实战课程无套路领取

锋哥开始收Java学员啦!

Python学习路线图

锋哥开始收Java学员啦!
当前位置: 主页 > Java文档 > Java基础相关 >

Synchronized_锁升级 PDF 下载


分享到:
时间:2020-11-19 10:27来源:http://www.java1234.com 作者:转载  侵权举报
Synchronized_锁升级 PDF 下载
失效链接处理
Synchronized_锁升级  PDF 下载


本站整理下载:
提取码:0vt4 
 
 
相关截图:
 
主要内容:


三、锁的优化
1、锁升级
锁的4中状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态(级别从低到高)
(1)偏向锁:
为什么要引入偏向锁?
因为经过HotSpot的作者大量的研究发现,大多数时候是不存在锁竞争的,常常是一个
线程多次获得同一个锁,因此如果每次都要竞争锁会增大很多没有必要付出的代价,为了
降低获取锁的代价,才引入的偏向锁。
偏向锁的升级
当线程1访问代码块并获取锁对象时,会在java对象头和栈帧中记录偏向的锁的
threadID,因为偏向锁不会主动释放锁,因此以后线程1再次获取锁的时候,需要比较当
前线程的threadID和Java对象头中的threadID是否一致,如果一致(还是线程1获取锁
对象),则无需使用CAS来加锁、解锁;如果不一致(其他线程,如线程2要竞争锁对
象,而偏向锁不会主动释放因此还是存储的线程1的threadID),那么需要查看Java对象
头中记录的线程1是否存活,如果没有存活,那么锁对象被重置为无锁状态,其它线程
(线程2)可以竞争将其设置为偏向锁;如果存活,那么立刻查找该线程(线程1)的栈
帧信息,如果还是需要继续持有这个锁对象,那么暂停当前线程1,撤销偏向锁,升级为
轻量级锁,如果线程1 不再使用该锁对象,那么将锁对象状态设为无锁状态,重新偏向新
的线程。
偏向锁的取消:
偏向锁是默认开启的,而且开始时间一般是比应用程序启动慢几秒,如果不想有这个延
迟,那么可以使用-XX:BiasedLockingStartUpDelay=0;
如果不想要偏向锁,那么可以通过-XX:-UseBiasedLocking = false来设置;
(2)轻量级锁
为什么要引入轻量级锁?
轻量级锁考虑的是竞争锁对象的线程不多,而且线程持有锁的时间也不长的情景。因为阻
塞线程需要CPU从用户态转到内核态,代价较大,如果刚刚阻塞不久这个锁就被释放
了,那这个代价就有点得不偿失了,因此这个时候就干脆不阻塞这个线程,让它自旋这等
待锁释放。
轻量级锁什么时候升级为重量级锁?
线程1获取轻量级锁时会先把锁对象的对象头MarkWord复制一份到线程1的栈帧中创建
的用于存储锁记录的空间(称为DisplacedMarkWord),然后使用CAS把对象头中的内
容替换为线程1存储的锁记录(DisplacedMarkWord)的地址;
如果在线程1复制对象头的同时(在线程1CAS之前),线程2也准备获取锁,复制了对象
头到线程2的锁记录空间中,但是在线程2CAS的时候,发现线程1已经把对象头换了,线
程2的CAS失败,那么线程2就尝试使用自旋锁来等待线程1释放锁。
但是如果自旋的时间太长也不行,因为自旋是要消耗CPU的,因此自旋的次数是有限制
的,比如10次或者100次,如果自旋次数到了线程1还没有释放锁,或者线程1还在执
行,线程2还在自旋等待,这时又有一个线程3过来竞争这个锁对象,那么这个时候轻量
级锁就会膨胀为重量级锁。重量级锁把除了拥有锁的线程都阻塞,防止CPU空转。


 
 
------分隔线----------------------------

锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程

锋哥推荐