在IBM JVM下,当多个线程试图在不同对象上同时调用Class.getAnnotation时(但具有相同的注释),我们遇到了一个问题.线程开始在Hashtable内的监视器上等待死锁,Hashtable用作IBM JVM中注释的缓存.最奇怪的是,持有此监视器的线程在Hashtable.get内置于"等待状态"状态,使所有其他线程无限期地等待.
IBM的支持表示,Class.getAnnotation的实现不是线程安全的.
与其他JVM实现(例如,OpenJDK)相比,我们看到它们以线程安全的方式实现了Class方法.IBM JVM是一个封闭的源JVM,它们确实将一些源代码与它们的JVM一起发布,但是只要它们的Class实现是线程安全的,它就不足以做出明确的判断.
只要其方法是线程安全的,Class文档就不会明确说明.那么将Class方法(特别是getAnnotation)视为线程安全或者我们必须在多线程环境中使用同步块是一个安全的假设吗?
流行的框架(例如Hibernate)如何缓解这个问题?我们在使用getAnnotation方法的Hibernate代码中没有发现任何同步用法.