2017-04-01 57 views
0

我知道每个Java对象都可以用作Monitor。如果与该对象关联的入口计数为零,则线程可以获取该锁。如果同一个线程获得锁,则通过“monitorenter”操作码增加入口计数,并且在“monitorexit”期间同一个线程释放代码时递减入口计数。这个入口数在哪里存储?它如何链接到一个Java对象?对象创建时它是否被分配?存储在Java中的对象的条目数在哪里

+0

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.monitorenter是我正在阅读的参考文献之一。 – UnderWood

回答

0

该计数在JVM内部使用,并且不能从代码中看到。但是,您可以自己计算它,但是请注意,即使在“synchronized”代码中发生异常,该锁也会被释放(JVM中的计数器减少到0)。

2

每个JVM可能具有不同的内部锁实现。对于HotSpot JVM,它根本不计算锁定条目,而是在方法的堆栈帧中预留带有monitorenter/monitorexit字节码的时隙。

的HotSpot JVM对Java的显示器两种机制:

  1. 偏锁。通过将线程ID放入对象头中,该对象对给定线程“偏向”。然后,在给定线程中锁定和解锁几乎是无操作的:JVM只需验证Biased Lock标记仍在对象头中。
  2. 定期递归锁定。如果一种方法具有​​块(即monitorenter/monitorexit)字节码,则在栈上保留一个位置以记录锁定信息:对象及其移位的报头(即锁定之前的报头值)。如果一个对象被递归地锁定,被移动的头部包含零,所以VM知道它不应该更新monitorexit上的对象头部。

更多详细信息请参见HotSpot sources