java多线程(五)轻量级锁
基于白嫖黑马程序员白嫖视频:全面深入学习java并发编程,java基础进阶中级必会教程
1 场景
如果一个对象虽然有多线程访问,但是多线程访问时间是错开的。
2 对象头的Mark Word部分
图片来源:JAVA 对象头解析
3 原理
参与者:线程和对象(无Monitor参与);
- 创建锁记录对象:当线程执行到临界区时,线程在栈帧(Stack Frame)里面创建一个锁记录(Lock Record)对象,这个对象两部分内容,一是可以指向一个锁定对象,二是存储锁定对象Mark Word;
- 锁记录工作(成功):指向需要锁定的对象,保存对象的Mark Word,把对象加锁(01->00);
- 锁失败:失败有两种情况;一是别人已经加上了,进入锁膨胀过程;二是自己已经把该对象锁加过了,锁重入,此时把存储对象Mark Word是null;
- 执行完解锁:恢复Mark Word给对象;如果失败说明锁已经升级,由重量级锁去解锁;
4 锁膨胀
参与角色:线程、对象、Monitor;
- 当轻量级锁尝试去锁对象时,发现对象已经被锁了,此时需要升级轻量级锁为重量级锁;
- 线程为对象申请Monitor锁,让对象指向重量级锁,对象的Mark Word变成10(重量级锁),然后自己进入Monitor的EntryList,自己进入BLOCKED状态;
- 原线程执行完释放锁:由于自己进来的时候去加的轻量级锁,被人竞争使得锁膨胀,所以自己进入重量级锁的解锁流程;
5 注意点
- 从java6开始;
- 轻量级锁对于使用者是透明的,语法依然是synchronized;