synchronized底层原理是什么?

synchronized锁住的同步块,会被编译生成2个字节码指令,monitorenter和monitorexit。

  1. 当执行monitorenter时,由于每个锁对象都有一个锁计数器,①当目标锁对象的锁计数器为零,则表明锁空闲,那么JVM会将计数器加1,并且把该锁对象的持有线程设置为当前线程。②当目标锁对象的锁计数器不为零,如果锁对象的持有线程是当前线程,那么JVM会将计数器加1,否则,需要等待,直到持有线程释放该锁。

  2. 当执行monitorexit时,JVM会将锁对象的计数器减1,计数器为0代表锁已被释放。

猜你喜欢

转载自juejin.im/post/7095625282953936933