我知道每个Java对象都可以用作Monitor。如果与该对象关联的入口计数为零,则线程可以获取该锁。如果同一个线程获得锁,则通过“monitorenter”操作码增加入口计数,并且在“monitorexit”期间同一个线程释放代码时递减入口计数。这个入口数在哪里存储?它如何链接到一个Java对象?对象创建时它是否被分配?存储在Java中的对象的条目数在哪里
0
A
回答
0
该计数在JVM内部使用,并且不能从代码中看到。但是,您可以自己计算它,但是请注意,即使在“synchronized”代码中发生异常,该锁也会被释放(JVM中的计数器减少到0)。
2
每个JVM可能具有不同的内部锁实现。对于HotSpot JVM,它根本不计算锁定条目,而是在方法的堆栈帧中预留带有monitorenter
/monitorexit
字节码的时隙。
的HotSpot JVM对Java的显示器两种机制:
- 偏锁。通过将线程ID放入对象头中,该对象对给定线程“偏向”。然后,在给定线程中锁定和解锁几乎是无操作的:JVM只需验证Biased Lock标记仍在对象头中。
- 定期递归锁定。如果一种方法具有块(即
monitorenter
/monitorexit
)字节码,则在栈上保留一个位置以记录锁定信息:对象及其移位的报头(即锁定之前的报头值)。如果一个对象被递归地锁定,被移动的头部包含零,所以VM知道它不应该更新monitorexit
上的对象头部。
更多详细信息请参见HotSpot sources。
相关问题
- 1. 在哪里存储objectstore和vwsession对象
- 2. git存储blob对象在哪里?
- 3. const对象存储在哪里
- 4. 此管理对象在哪里存储?
- 5. 存储对象实例在哪里?
- 6. Web应用程序中存储的对象在哪里?
- 7. 在哪里存储数据?
- 8. 数据存储在哪里?
- 9. android.graphics.Path对象在哪里存储其数据?
- 10. 哪里存储对象信息django?
- 11. 在哪里把页面对象保存在Maven项目中
- 12. 检查对象等于存储在java对象中的数据
- 13. Java系统包在哪里存储?
- 14. Java HttpSession属性存储在哪里?
- 15. ProfileBase.Save()存储我的数据在哪里?
- 16. 在哪里存储jquery的数据?
- 17. 在哪里存储我的数据?
- 18. 持久的mule对象存储区,文件在哪里?
- 19. Steam在哪里存储库目录?
- 20. svn在哪里存储项目代码?
- 21. Jenkins在哪里存储项目源
- 22. 在哪里编写和存储java项目中的mongoDB map/reduce函数
- 23. 在Java中存储捕获的变量在哪里?
- 24. 存储在Android项目中的内容提供者在哪里?
- 25. SSL对称密钥存储在哪里?
- 26. SecKeyGeneratePair在哪里存储密钥对?
- 27. Android中的权限存储在哪里?
- 28. 空条目在哪里?
- 29. cck“数值”数据存储在哪里?
- 30. 在哪里存储将在我的应用程序中使用常量对象
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.monitorenter是我正在阅读的参考文献之一。 – UnderWood