今天看啥  ›  专栏  ›  老猫吃饭团

轻量级锁

老猫吃饭团  · 简书  ·  · 2019-12-20 19:14

文章预览

轻量级锁

轻量级加锁

在线程执行同步代码块之前, JVM 会先在当前线程的栈帧中创建一个空间用于存储锁记录,然后将对象头中的 Mark Word 复制到锁记录中。然后,线程尝试使用 CAS 将对象头中的 Mark Word 替换为锁记录的指针。如果成功,当前线程获得锁,如果失败,意味着其它线程在竞争锁资源,当前线程便尝试使用自旋获得锁。

轻量级锁解锁

轻量级解锁时,会使用原子的 CAS 操作将 Displaced Mark Word 替换回到对象头,如果成功,则表示没有竞争发生。如果失败,表示当前锁存在竞争,锁就会膨胀成重量级锁。

image.png

自旋会消耗CPU,为了避免无用的自旋(比如获得锁的线程被阻塞住了),一旦锁升级之后,就无法恢复。当锁处于这个状态下,其他线程试图获取锁时,都会被阻塞住,当持有锁的线程释放锁之后会唤醒这些线程,被唤醒的线程就会进行新一轮的 夺锁

………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览