锁的升级与降级

synchronized代码块是由monitorenter / monitorexit指令实现的

现在JVM提供了三种监视器,偏向锁,轻量级锁,重量级锁。为了优化同步的运行机制,有了升级与降级,当JVM检测到不同的竞争状态时采取合适的锁的实现。

当没有竞争的时候,默认使用偏向锁,JVM利用CAS操作,在对象头的MarkWord设置了线程ID,表示这个对象偏向于当前线程,但是这并不真正的涉及到互斥锁。一般用偏向锁也可以无竞争的开销。

如果有另外的线程试着锁定某个被偏向过得对象,JVM首先会撤销偏向锁。然后切换到轻量级锁的实现,通过CAS修改对象头的MarkWord来试图获取锁,如果重试成功,就使用普通的轻量级锁,如果重试不成功,就会膨化为重量级锁。

猜你喜欢

转载自blog.csdn.net/OrangeRawNorthland/article/details/84553834