据我所知,每个Java对象都可以用作Monitor。如果与对象关联的条目计数为零,则线程可以获取锁。并且如果相同的线程获得锁定,则条目计数通过" monitorenter"递增。当相同的线程在" monitorexit"期间释放代码时,操作码和递减。这个条目计数存储在哪里?它是如何链接到Java对象的?它是在创建对象时分配的吗?
答案 0 :(得分:2)
每个JVM可能具有不同的内部锁实现。对于HotSpot JVM,它根本不计算锁定条目,而是在具有monitorenter
/ monitorexit
字节码的方法的堆栈帧中保留插槽。
HotSpot JVM有两种Java监视器机制:
synchronized
块(即monitorenter
/ monitorexit
)字节码,则会在堆栈上保留一个位置以记录锁定信息:一个对象及其替换的标题(即锁定前的标题值)。如果一个对象被递归锁定,则被移位的头部包含零,因此VM知道它不应该更新monitorexit
上的对象头。HotSpot sources中的更多详情。
答案 1 :(得分:0)
此计数在JVM内部使用,无法从您的代码中看到。 但是你可以自己计算,但要注意,即使是在" synchronized"中发生Exception,锁定也会被释放(JVM中的计数器减少到0)。代码。