【发布时间】:2014-08-21 01:01:09
【问题描述】:
在 IBM JVM 下,当多个线程尝试在不同对象上同时调用 Class.getAnnotation(但使用相同的注解)时,我们遇到了一个问题。线程开始在 Hashtable 内的监视器上等待死锁,该监视器用作 IBM JVM 中注释的缓存。最奇怪的是,持有此监视器的线程在 Hashtable.get 中被置于“等待条件”状态,使所有其他线程无限期等待。
IBM 的支持声明 Class.getAnnotation 的实现不是线程安全的。
与其他 JVM 实现(例如 OpenJDK)相比,我们看到它们以线程安全的方式实现 Class 方法。 IBM JVM 是一个闭源 JVM,他们确实会和他们的 JVM 一起发布一些源代码,但是他们的 Class 实现是否是线程安全的,还不足以做出明确的判断。
Class 文档没有明确说明它的方法是否是线程安全的。那么将 Class 方法(特别是 getAnnotation)视为线程安全是安全的假设,还是我们必须在多线程环境中使用同步块?
流行的框架(例如 Hibernate)如何缓解这个问题?我们没有在使用 getAnnotation 方法的 Hibernate 代码中发现任何同步用法。
【问题讨论】:
-
虽然是个好问题,但对于这个论坛来说可能过于自以为是。
so who is wrong here? -
您说的是 OpenJDK,而是 IBM JVM。您实际使用的是哪种实现?
-
正如我的一位导师曾经对我说的:“代码不会说谎。”如果这就是您在源代码中看到的,那么这就是正在发生的事情。
-
@jarnbjo Oracle 的实现是事实上的标准。如果您想出售与 Oracle 有很大差异的 JDK 或 JRE,即使您的产品在技术上是 已发布标准的正确实现,那么您将自行承担风险。跨度>
-
如果他们声称它不是线程安全的,为什么他们使用线程安全集合 Hashtable?这听起来像一个错误。没有明显的理由应该锁定不可变对象以使其线程安全。
标签: java multithreading concurrency jvm