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

标签 java multithreading static non-static

我的类(class)看起来像这样:

public Class A {

     private static final ObjectMapper mapper = new ObjectMapper();

     public String get(String key) {
          JsonNode nod = mapper.readTree(getFromCache(key));
     }
}

多个线程将访问此方法。我需要同步它吗?我需要在方法内部移动映射器吗?

最佳答案

这取决于 ObjectMapper 的实现。有关可能的答案,请参阅: Should I declare Jackson's ObjectMapper as a static field?

无法从您提供的代码示例中分辨出来,因为我们不知道 ObjectMapper 是什么。

要找到答案,您需要查看 ObjectMapper 的 javadoc。否则,实现。

如果您不确定,您可以:

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

在 JVM 上创建对象的成本非常低(除非它们执行扫描类路径等昂贵的操作)。

关于java - 当多个线程正在访问它时,在非静态方法中使用静态对象是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39845202/

相关文章:

java - 为什么 Spring Boot 中的 REST Controller 返回 HTTP 状态 404 – 未找到

java - 如何使自动生成的解析器类实现 ANTLR4 中的接口(interface)?

java - 在正则表达式解析中处理 Unicode 单词

Java - 为什么这个基本的 ticking 类会占用这么多 cpu?

c++ - 从线程更新进度条的最佳方法

c# - 通过 await 关键字返回任务和不使用 await 关键字返回的主要区别是什么?

c# 在静态构造函数中初始化泛型集合时出现 TypeInitializationException

java - 为什么要使用私有(private)静态内部类?打败静态内部类的目的?

java - java中为什么直接调用静态变量和方法?

java - 一个JFrame中的两个面板,如何到达另一个面板的CardLayout?