synchronized锁住的同步块,会被编译生成2个字节码指令,monitorenter和monitorexit。
-
当执行monitorenter时,由于每个锁对象都有一个锁计数器,①当目标锁对象的锁计数器为零,则表明锁空闲,那么JVM会将计数器加1,并且把该锁对象的持有线程设置为当前线程。②当目标锁对象的锁计数器不为零,如果锁对象的持有线程是当前线程,那么JVM会将计数器加1,否则,需要等待,直到持有线程释放该锁。
-
当执行monitorexit时,JVM会将锁对象的计数器减1,计数器为0代表锁已被释放。