下面我来介绍一下轻量级锁。
轻量级锁的使用场景是:虽然有多个线程使用这个锁,但是多个线程之间使用的时间是错开的(也就是不存在竞争)。那么这个时候就可以使用轻量级锁来优化。
当一个线程进入同步块之前,JVM会在这个线程的栈帧中创建一个存储锁的记录的空间,然后将锁的Markword复制到锁记录中。接着进入加锁阶段,当前线程会尝试使用CAS将对象头的Markword替换为指向锁记录的指针。如果替换成功,说明获得锁;如果替换失败,则说明有其他线程在竞争锁,当前线程就使用自旋的操作来获得锁。
轻量级锁解锁时会尝试使用CAS操作将将锁的对象头的Markword替换为存储在锁记录中的Markword Displayed Mark Word替换为对象头。如果替换成功,说明没有线程在竞争该锁;如果失败,说明有其他线程在竞争该锁,那么接下来锁会膨胀为重量级锁。