gpt4 book ai didi

java - 什么时候不同步读/写变量是安全的?

转载 作者:搜寻专家 更新时间:2023-10-31 20:17:55 25 4
gpt4 key购买 nike

在 Java 中,什么时候可以“摆脱”不对多个并发线程读/写的变量使用同步?

我读到了一些令人惊讶的并发错误:double-checked-lockinghash-maps ,并且一直在共享读/写情况下默认使用同步,但是,我开始怀疑什么时候可以不用。

例如,我可以使用什么样的一般规则来决定何时实际上可以安全地从这样的方法中省略 synchronized:

T getFoo() {
if (this.foo == null) {
this.foo = createFoo() // createFoo is always thread safe.
}
return this.foo;
}

地点:

  • T 可能是基元或任意对象
  • createFoo 始终是线程安全的,可以多次调用,但未指定。
  • getFoo() 可以“最终一致”。

如果 T 是 int 之类的原语可以吗? Integer 怎么样?像 String 这样的简单对象呢?等等

最佳答案

什么时候不同步读/写变量是安全的?

半开玩笑的回答是只有当您完全理解对底层硬件、JVM 和您的应用程序的影响时。如果可能的话,我仍然推荐这种方法,它从大量阅读和实验开始。

在实践中,您应该能够使用一些常用的模式来最大程度地减少代码中同步 方法或 block 的数量,而无需理解所述模式的所有复杂性。这不应该过多地增加您的应用程序的风险,因为甚至围绕 synchronized 的使用也有重要的细节,如果您了解所有这些细节,您会问一个不同的问题.

不过,您的里程数可能会有所不同,特别是如果您本地的并发大师不支持上述常用模式的形式和实现。

废话少说,举个例子

  1. 使用线程安全的集合、实用程序和类型。
    • 这包括尽可能依赖 java.util.concurrent
    • 在 JDK 及其生态系统之外,还有大量适用于 Java 的附加库和工具,但它们不符合“现在申请,稍后阅读更多”的条件。
  2. 使用volatile
  3. 使用安全初始化和安全发布
  4. 将数据保持在线程本地。
    • 有点简单,而且出人意料地经常适用。

关于java - 什么时候不同步读/写变量是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37168009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com