Методы java.lang.Class безопасны для потоков?
В IBM JVM мы столкнулись с проблемой, когда несколько потоков пытаются одновременно вызывать Class.getAnnotation для разных объектов (но с одной и той же аннотацией). Потоки начинают блокировать ожидание на мониторе внутри Hashtable, который используется в качестве кэша для аннотаций в IBM JVM. Самое странное, что поток, который удерживает этот монитор, переводится в состояние «ожидания по состоянию» прямо внутри Hashtable.get, заставляя все остальные потоки ждать бесконечно.
Служба поддержки IBM заявила, что реализация Class.getAnnotation не является поточно-ориентированной.
По сравнению с другими реализациями JVM (например, OpenJDK) мы видим, что они реализуют методы класса в поточно-ориентированном виде. IBM JVM - это JVM с закрытым исходным кодом, они публикуют некоторый исходный код вместе со своей JVM, но этого недостаточно для четкого суждения, когда реализация Class является поточно-ориентированной или нет.
Документация класса не содержит четкого указания, когда его методы поточно-ориентированы или нет. Так это безопасное предположение для обработки методов класса (в частности, getAnnotation) как потокобезопасных или мы должны использовать блоки синхронизации в многопоточной среде?
Как популярные фреймворки (например, Hibernate) смягчают эту проблему? Мы не нашли никакого использования синхронизации в коде Hibernate, который использовал метод getAnnotation.