存储在Java中的对象的条目计数在哪里

时间:2017-04-01 02:44:25

标签: java multithreading jvm synchronized monitor

据我所知,每个Java对象都可以用作Monitor。如果与对象关联的条目计数为零,则线程可以获取锁。并且如果相同的线程获得锁定,则条目计数通过" monitorenter"递增。当相同的线程在" monitorexit"期间释放代码时,操作码和递减。这个条目计数存储在哪里?它是如何链接到Java对象的?它是在创建对象时分配的吗?

2 个答案:

答案 0 :(得分:2)

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

HotSpot JVM有两种Java监视器机制:

  1. 有偏见的锁定。该对象有偏见'通过将线程ID放在对象头中来实现给定线程。然后在给定线程中锁定和解锁几乎是一个无操作:JVM只需要验证Biased Lock标记仍在对象头中。
  2. 常规递归锁定。如果方法具有synchronized块(即monitorenter / monitorexit)字节码,则会在堆栈上保留一个位置以记录锁定信息:一个对象及其替换的标题(即锁定前的标题值)。如果一个对象被递归锁定,则被移位的头部包含零,因此VM知道它不应该更新monitorexit上的对象头。
  3. HotSpot sources中的更多详情。

答案 1 :(得分:0)

此计数在JVM内部使用,无法从您的代码中看到。 但是你可以自己计算,但要注意,即使是在" synchronized"中发生Exception,锁定也会被释放(JVM中的计数器减少到0)。代码。