轻量级锁到底是怎么回事啊啊啊啊

原创
2019/04/18 09:15
阅读数 201

微信公众号:IT一刻钟
大型现实非严肃主义现场
一刻钟与你分享优质技术架构与见闻,做一个有剧情的程序员
关注可第一时间了解更多精彩内容,定期有福利相送哟。

之前我们讲了synchronized的原理(《且听我一个故事讲透一个锁原理之synchronized》),以及其中的偏向锁(《偏向锁到底是怎么回事啊啊啊啊》),送佛送到西,这次我们来说一说轻量级锁吧。
友情提醒:上面两篇没有看过的看官,请先阅读上面两篇之后,再读此篇,这样效果会更佳哦~

开局一张图。

看一张大图

轻量级锁

流程讲解

当JVM关闭了偏向锁模式,对象在创建的时候,Mark Word中存储的是hash值,年代,是否偏向锁标志位为0,标志位是01。即一个无锁不可偏向状态。

轻量级锁逻辑
1.当线程访问同步块,先判断锁状态标志位,如果是00,则说明是轻量级锁,JVM会先在当前线程栈帧中分配Lock Record空间;

2.将锁对象头中的Mark Word拷贝到当前线程的Lock Record中,称为Displaced Mark Word,然后使用CAS,将对象头中的Mark Word修改为指向当前线程栈中Lock Record的指针(如图)。如果成功,则获取轻量级锁,执行同步块中的代码,如果失败,则进行自旋竞争锁,自旋达到一定的次数如果依旧没有获取到锁,则升级为重量级锁(因为自旋会消耗CPU,为了避免无用的自旋,一旦锁升级为重量级锁,就不会恢复到轻量级锁,自旋的线程会被挂起阻塞住);
CAS操作之前堆栈与对象的状态

CAS操作之前堆栈与对象的状态

CAS操作之后堆栈与对象的状态

CAS操作之后堆栈与对象的状态

3.执行完同步代码块代码,退出同步代码块,使用CAS开始轻量级锁解锁,解锁的条件需要满足以下两个:
1)对象头Mark Word中锁记录指针是否依旧指向当前线程Lock Record
2)拷贝在当前线程Lock Record的Mark Word信息是否与对象头中的Mark Word一致

4.如果满足,则成功释放锁;

5.如果不满足,则释放锁,唤醒被挂起阻塞的线程,开始重量级锁的竞争。

注:当超过自旋阈值,竞争的线程就会把锁对象Mark Word指向重量级锁,导致Mark Word中的值发生了变化,当原持有轻量级锁的线程执行完毕,尝试通过CAS释放锁时,因为Mark Word已经指向重锁,不再是指向当前线程Lock Record的指针,于是解锁失败,这时原持有轻量级锁的线程就会知道锁已经升级为重量级锁。

偏向锁升级为轻量级锁:
1.先在原持有偏向锁的线程栈帧中分配Lock Record;

2.将对象头Mark Word拷贝到原持有偏向锁的线程Lock Record中,然后使用CAS,将对象头中的Mark Word修改为指向当前线程栈中Lock Record的指针。将原持有偏向锁的线程升级为持有偏向锁的线程;

3.唤醒线程,从安全点继续执行,执行完毕解锁。

轻量级锁的重入计数

我们看个demo,在该demo中重复3次获得锁,

synchronized(obj){
    synchronized(obj){
        synchronized(obj){
        }
    }
}

假设锁的状态是轻量级锁,如图反应了Mark Word和线程栈中Lock Record的关系,右边线程栈中包含3个指向当前锁对象的Lock Record。其中栈中最高位的Lock Record为第一次获取锁时分配的,其中Displaced Mark word为锁对象加锁前的Mark Word,而之后的锁重入,则会在线程栈中分配一个Displaced Mark word为null的Lock Record,用来重入计数。

重入

每次释放锁的时候则会删除对应的Lock Record。
这就是轻量级锁的实现逻辑,相对于偏向锁来说,逻辑会稍微简单一些。

如果觉得学习到了,欢迎转发加关注,那是我分享的动力呀~

ru guo jue de bu cuo, dian ji yi xia guang gao zhi chi wo yi xia ~


推荐阅读

从RocketMQ我们学到了什么?(NameServer篇)

一篇读懂分布式架构下的负载均衡

你与解决“缓存污染”只差这篇文章的距离

且听我一个故事讲透一个锁原理之synchronized

偏向锁到底是怎么个回事啊啊啊啊

什么,你的ThreadLocal内存泄漏了?



本文分享自微信公众号 - IT一刻钟(it_info)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部