Java中锁的优化机制相识吗?

开发者 2024-9-8 21:04:46 83 0 来自 中国
从JDK1.6版本之后,synchronized自己也在不绝优化锁的机制,有些情况下他并不会是⼀个很重量级的锁了。优化机制包罗⾃顺应锁、⾃旋锁、锁消除、锁粗化、轻量级锁和方向锁。
锁的状态从低到⾼依次为⽆锁->方向锁->轻量级锁->重量级锁,升级的过程就是从低到⾼,降级在⼀定条件也是有大概发⽣的。
⾃旋锁:由于⼤部分时间,锁被占⽤的时间很短,共享变量的锁定时间也很短,全部没有须要挂起线程,⽤户态和内核态的往返上下⽂切换严峻影响性能。⾃旋的概念就是让线程执⾏⼀个忙循环,可以明白为就是啥也不⼲,防⽌从⽤户态转⼊内核态,⾃旋锁可以通过设置-XX:+UseSpining来开启,⾃旋的默认次数是10次,可以使⽤-XXreBlockSpin设置。
⾃顺应锁:⾃顺应锁就是⾃顺应的⾃旋锁,⾃旋的时间不是固定时间,⽽是由前⼀次在同⼀个锁上的⾃旋时间和锁的持有者状态来决定。
锁消除:锁消除指的是JVM检测到⼀些同步的代码块,完全不存在数据竞争的场景,也就是不须要加锁,就会进⾏锁消除。
锁粗化:锁粗化指的是有很多操纵都是对同⼀个对象进⾏加锁,就会把锁的同步范围扩展到整个操纵序列之外。
方向锁:当线程访问同步块获取锁时,会在对象头和栈帧中的锁记载⾥存储方向锁的线程ID,之后这个线程再次进⼊同步块时都不须要CAS来加锁息争锁了,方向锁会永世方向第⼀个得到锁的线程,假如后续没有其他线程得到过这个锁,持有锁的线程就永世不须要进⾏同步,反之,当有其他线程竞争方向锁时,持有方向锁的线程就会开释方向锁。可以⽤过设置-XX:+UseBiasedLocking开启方向锁。
轻量级锁:JVM的对象的对象头中包罗有⼀些锁的标志位,代码进⼊同步块的时间,JVM将会使⽤CAS⽅
式来尝试获取锁,假如更新乐成则会把对象头中的状态位标志为轻量级锁,假如更新失败,当火线程就
尝试⾃旋来得到锁。
整个锁升级的过程⾮常复杂,我尽⼒去除⼀些⽆⽤的环节,简单来形貌整个升级的机制。
简单点说,方向锁就是通过对象头的方向线程ID来对⽐,甚⾄都不须要CAS了,⽽轻量级锁重要就是通
过CAS修改对象头锁记载和⾃旋来实现,重量级锁则是除了拥有锁的线程其他全部壅闭。
1.png
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 04:24, Processed in 0.175067 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表