轻量级锁不是为了代替重量级锁,它的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。
加锁
- 首先,JVM在当前线程栈帧中创建用于存储锁记录的空间;
- 将对象头中的Mark Word复制到锁记录中,称为Displaced Mark Word;
- 线程尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针,成功则代表获得锁,失败表示其他线程竞争锁,当前线程尝试使用自旋操作来获取锁。
解锁
- 使用CAS将Displaced Mark Word替换回到对象头;
- 如果成功,则表示没有竞争发生;
- 如果失败,则表示当前锁存在竞争,锁就会膨胀为重量级锁。