文章预览
轻量级锁
轻量级加锁
在线程执行同步代码块之前,
JVM
会先在当前线程的栈帧中创建一个空间用于存储锁记录,然后将对象头中的
Mark Word
复制到锁记录中。然后,线程尝试使用
CAS
将对象头中的
Mark Word
替换为锁记录的指针。如果成功,当前线程获得锁,如果失败,意味着其它线程在竞争锁资源,当前线程便尝试使用自旋获得锁。
轻量级锁解锁
轻量级解锁时,会使用原子的
CAS
操作将
Displaced Mark Word
替换回到对象头,如果成功,则表示没有竞争发生。如果失败,表示当前锁存在竞争,锁就会膨胀成重量级锁。
自旋会消耗CPU,为了避免无用的自旋(比如获得锁的线程被阻塞住了),一旦锁升级之后,就无法恢复。当锁处于这个状态下,其他线程试图获取锁时,都会被阻塞住,当持有锁的线程释放锁之后会唤醒这些线程,被唤醒的线程就会进行新一轮的
夺锁
。
………………………………