当前位置: 首页 > 知识库问答 >
问题:

java.lang.class方法是线程安全的吗?

燕经国
2023-03-14

IBM的支持指出,Class.GetAnnotation的实现不是线程安全的。

与其他JVM实现(例如,OpenJDK)相比,我们可以看到它们以线程安全的方式实现类方法。IBM JVM是一个闭源JVM,他们确实会发布一些源代码和他们的JVM一起,但无论什么时候他们的类实现是否线程安全,都不足以做出明确的判断。

类文档没有清楚地说明它的方法何时是线程安全的。那么,将类方法(特别是getAnnotation)视为线程安全是一个安全的假设,还是我们必须在多线程环境中使用同步块?

共有1个答案

高寒
2023-03-14

您的问题可能与Oracle Java版本8中修复的bug有关。

一个线程在一个注释类上调用isAnnotationPresent,该注释尚未为其定义类加载器初始化。这将导致对AnnotationType.GetInstance的调用,锁定sun.reflect.annotation.AnnotationType的类对象。getInstance将导致该批注的class.InitAnnotationSifEmerced,试图获取该批注的class对象上的锁。

同时,另一个线程为该注释(!)请求了Class.GetAnnotations。由于getAnnotations锁定它被请求的class对象,所以当第一个线程运行到class.InitAnnotationSifensive中时,它无法锁定该批注。但是持有锁的线程将试图获取第一个线程持有的AnnotationType.GetInstance中的sun.reflect.annotation.annotationType类对象的锁,从而导致死锁。

 类似资料:
  • 看起来它工作得很好,但我想知道我是否必须确保新代码需要线程安全?这里有什么意见吗?抱歉用了假名字,提前致谢。

  • 例如,以下方法: 我关心的是如果我有多个线程调用。对象是否可能被另一个线程覆盖?换句话说,Thread 1调用并获取返回的

  • 问题内容: 我有多个线程试图更新MySQL数据库?使用executeUpdate方法是线程安全的吗? 问题答案: 不,使用它不是线程安全的。 实际上,如果其他某个线程使用一条语句,然后另一个线程调用executeUpdate(),则另一个线程的s(如果有的话)将被关闭。“ javadoc.sql.Statement的JavaDoc(PreparedStatement是其子类型) ”如果存在打开的语

  • 问题内容: 在我的Java项目中,我需要以多种方式使用TreeMap。我发现ConcurrentSkipListMap是我需要的,但是某些方法不是线程安全的。其中之一- containsKey(Object key)。以多种方式使用此方法的典型解决方案是什么?在我的程序中,我需要放置不会替换旧密钥的密钥,如果不可能的话,我将放置另一个密钥而不会获得唯一密钥。因为我不会丢失信息,所以应该使用哪种构造

  • 我读过很多关于Servlet和threadsafe的文章--我知道,“Servlet容器只加载和实例化每个Servlet一次……”。但是,如果我创建抽象类extends Servlet,它有一个用参数处理的方法,那么在后代中使用这个threadsafe吗?

  • 问题内容: 根据Swing教程: 一些Swing组件方法在API规范中被标记为“线程安全”。这些可以从任何线程安全地调用。所有其他Swing组件方法都必须从事件分发线程中调用。忽略此规则的程序在大多数情况下都可以正常运行,但是会遇到难以预料的错误,这些错误很难重现。 但是这些标记为“线程安全”的Swing组件方法是什么?真的有吗? 更新/赏金: 是否有线程安全的摆动方法的 完整列表 ?(线程安全的