Juc20_Synchronized锁升级、无锁、偏向锁、轻量级锁、重量级锁、锁消除、锁粗化(三)

简介: ④. 轻量级锁 多个线程竞争

④. 轻量级锁 多个线程竞争


  • ①. 主要作用(本质就是自旋锁)
    有线程来参与锁的竞争,但是获取锁的冲突时间极短


  • ②. 64位标记图再看


image.png


③. 轻量级锁的获取


理论落地


(1). 轻量级锁是为了在线程近乎交替执行同步块时提高性能


(2). 主要目的: 在没有多线程竞争的前提下,通过CAS减少重量级锁使用操作系统互斥量产生的性能消耗,说白了先自旋再阻塞


(3). 升级时机:当关闭偏向锁功能或多线程竞争偏向锁会导致偏向锁升级为轻量级锁


(4). 假如线程A已经拿到锁,这时线程B又来抢该对象的锁,由于该对象的锁已经被线程A拿到,当前该锁已是偏向锁了。


而线程B在争抢时发现对象头Mark Word中的线程ID不是线程B自己的线程ID(而是线程A),那线程B就会进行CAS操作希望能获得锁。


此时线程B操作中有两种情况


如果锁获取成功,直接替换Mark Word中的线程ID为B自己的ID(A → B),重新偏向于其他线程(即将偏向锁交给其他线程,相当于当前线程"被"释放了锁),该锁会保持偏向锁状态,A线程Over,B线程上位


微信图片_20220108145618.png


如果锁获取失败,则偏向锁升级为轻量级锁,此时轻量级锁由原持有偏向锁的线程持有,继续执行其同步代码,而正在竞争的线程B会进入自旋等待获得该轻量级锁。


微信图片_20220108145645.png


④. 代码展示

如果关闭偏向锁,就可以直接进入轻量级锁 -XX:-UseBiasedLocking


微信图片_20220108145700.png


⑤. 自旋达到一定次数和程度


java6之前(了解):默认启用,默认情况下自旋的次数是10次,-XX:PreBlockSpin=10来修改或者自旋线程数超过cpu核数一半


Java6之后:自适应(自适应意味着自旋的次数不是固定不变的),而是根据:同一个锁上一次自旋的时间和拥有锁线程的状态来决定。


⑥. 轻量锁与偏向锁的区别和不同


争夺轻量级锁失败时,自旋尝试抢占锁


轻量级锁每次退出同步块都需要释放锁,而偏向锁是在竞争发生时才释放锁


相关文章
|
3月前
|
Java
无锁和偏向锁有什么区别吗
【10月更文挑战第20天】无锁和偏向锁有什么区别吗
28 0
|
3月前
|
Java 开发者
偏向锁和轻量级锁的适用场景是什么
【10月更文挑战第20天】偏向锁和轻量级锁的适用场景是什么
|
3月前
|
Java API
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
46 0
|
7月前
|
存储 安全 算法
深入探索Java中的MarkWord与锁优化机制——无锁、偏向锁、自旋锁、重量级锁
深入探索Java中的MarkWord与锁优化机制——无锁、偏向锁、自旋锁、重量级锁
178 1
|
8月前
|
Java 编译器
多线程(锁升级, 锁消除, 锁粗化)
多线程(锁升级, 锁消除, 锁粗化)
70 1
|
8月前
|
存储 安全 Java
12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
93 1
12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
|
8月前
|
Java 编译器 程序员
synchronized 原理(锁升级、锁消除和锁粗化)
synchronized 原理(锁升级、锁消除和锁粗化)
|
存储 Java
重量级锁,偏向锁和轻量级锁
重量级锁,偏向锁和轻量级锁
111 0
|
存储 对象存储
偏向锁
基础
106 0
锁消除、锁粗化、锁升级区别与联系
锁消除、锁粗化、锁升级区别与联系
锁消除、锁粗化、锁升级区别与联系