轻量级锁
大约 1 分钟
1、轻量级锁
锁撤销升级为轻量级锁之后,那么对象的Markword也会进行相应的的变化。
下面先简单描述下锁撤销之后,升级为轻量级锁的过程:
a) 线程在自己的栈桢中创建锁记录 LockRecord。
b) 将锁对象的对象头中的MarkWord复制到线程的刚刚创建的锁记录中。
c) 将锁记录中的Owner指针指向锁对象。
d) 将锁对象的对象头的MarkWord替换为指向锁记录的指针。
2、锁消除
由于偏向锁失效了,那么接下来就得把该锁撤销,锁撤销的开销花费还是挺大的,其大概的过程如下:
a) 在一个安全点停止拥有锁的线程。
b) 遍历线程栈,如果存在锁记录的话,需要修复锁记录和Markword,使其变成无锁状态。
c) 唤醒当前线程,将当前锁升级成轻量级锁。
所以,如果某些同步代码块大多数情况下都是有两个及以上的线程竞争的话,那么偏向锁就会是一种累赘,对于这种情况,我们可以一开始就把偏向锁这个默认功能给关闭
3、锁膨胀
当出现有两个线程来竞争锁的话,那么偏向锁就失效了,此时锁就会膨胀,升级为轻量级锁。这也是我们经常所说的锁膨胀