JAVA锁升级(锁膨胀)的过程
JAVA锁升级(锁膨胀)的过程
⽂章⽬录
1.背景
在jdk获取锁的前期,需要jvm向内核申请,需要计算机内核参与,因此获取锁和释放锁的成本⼤⼤提⾼;在jdk1.6之后有所优化,但是为了提⾼锁的效率,锁升级还是⼤⼤的有必要。锁只能升级不能降级,升级的策略是为了提⾼锁的效率。
jdk1.6之后锁分四种状态:⽆锁 → 偏向锁 → 轻量级锁 → 重量级锁
2.概念
2.1.⽆锁
pojo包程序不会有锁的竞争,在程序设计不需要考虑锁的情况下为⽆锁。
2.2.偏向锁
在程序设计需要考虑锁的情况下,在运⾏过程中,只有⼀个线程访问代码块,⽽且还未产⽣多线程竞争的条件下,程序会添加⼀个偏向锁,标识代码块已经有线程访问,当同⼀个线程再次访问时,可以跳过加锁操作,由于之前没有释放锁,这⾥也就不需要重新加锁。如果⾃始⾄终使⽤锁的线程只有⼀个,很明显偏向锁⼏乎没有额外开销,性能极⾼。
如果运⾏过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它⾝上的偏向锁,将锁恢复到标准的轻量级锁。⼀旦有第⼆个线程加⼊锁竞争,偏向锁就升级为轻量级锁(⾃旋锁)。升级为轻量级锁的时候需要撤销偏向锁,撤销偏向锁的时候会导section什么意思
致STW(stop the word)操作。
2.3.轻量锁(⾃旋锁)
在发⽣锁竞争的情况下,未获得锁的线程发⽣⾃旋,直到获取到锁为⽌。但是长时间的⾃旋操作⾮常影响性能,如果达到了⼀下两个条件,则会再次升级为重量级锁。
⾃旋时间超过某个阈值
⾃旋线程数超过某个阈值java下载过程
2.4.重量级锁
重量级锁会将⾃⼰挂起,加⼊等待队列,释放cpu资源,等待其他线程唤醒。在JDK1.6之前,synchronized直接加重量级锁,很明显现在得到了很好的优化。
锁优点缺点适⽤场景
偏向锁加锁和解锁不需要额外的消耗,和执⾏⾮同步⽅法⽐仅存在纳
秒级的差距。
如果线程间存在锁竞争,会带来额外的锁撤
销的消耗。
适⽤于只有⼀个线程访问同步块
场景。
轻量级锁竞争的线程不会阻塞,提⾼了程序的响应速度。
如果始终得不到锁竞争的线程使⽤⾃旋会消
crayon怎么读英语耗CPU。
属性同好会有几个人喜欢男主追求响应时间。同步块执⾏速度
⾮常快。
重量级锁线程竞争不使⽤⾃旋,不会消耗CPU。线程阻塞,响应时间缓慢。
追求吞吐量。同步块执⾏速度较
长。
3.锁的状态主要表现在对象头的MarkWord中
锁状态标志位
网站分享代码⽆锁001
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论