java多线程(五)轻量级锁

基于白嫖黑马程序员白嫖视频:全面深入学习java并发编程,java基础进阶中级必会教程

1 场景

如果一个对象虽然有多线程访问,但是多线程访问时间是错开的。

2 对象头的Mark Word部分

java多线程(五)轻量级锁
图片来源: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;