当多个线程访问静态对象时,在非静态方法中使用静态对象是否安全?

Far*_*had 1 java static multithreading non-static

我的班级看起来像这样:

public Class A {

     private static final ObjectMapper mapper = new ObjectMapper();

     public String get(String key) {
          JsonNode nod = mapper.readTree(getFromCache(key));
     }
}
Run Code Online (Sandbox Code Playgroud)

多个线程将访问此方法.我需要同步它吗?我是否需要在方法中移动映射器?

WW.*_*WW. 5

这取决于实施ObjectMapper.有关可能的答案,请参阅: 我应该将Jackson的ObjectMapper声明为静态字段吗?

从您提供的代码示例中无法判断,因为我们不知道它ObjectMapper是什么.

要找到答案,您需要检查javadoc ObjectMapper.或者失败了,实施.

如果您不确定,您可以:

  • ObjectMapper在方法内创建一个新的,所以每次都有一个新对象,
  • 创建一个ThreadLocal,这样每个线程都有自己的对象

在JVM上创建对象非常便宜(除非他们执行昂贵的操作,如扫描类路径等).

  • 如果您使用`ThreadLocal`,请注意线程池工作者等长期存在的线程中的"泄漏".只要线程处于活动状态,线程本地对象就会挂起,即使线程最终被分配给某个完全不同的任务. (3认同)