Методы 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.

Ответы на вопрос(2)

Ваш ответ на вопрос