gpt4 book ai didi

java - 使用 java.util.concurrent.Concurrent* 容器时使用 volatile 有什么好处?

转载 作者:搜寻专家 更新时间:2023-11-01 04:05:14 29 4
gpt4 key购买 nike

当我看到这段代码时出现了问题:

private static volatile ConcurrentHashMap<String, String> cMap = null;
static {
cMap = new ConcurrentHashMap<String, String>();
}

对我来说,因为容器是 ConcurrentHashMap,所以 volatile 看起来是多余的根据JavaDoc已经有了synchronized puts,DUH,使用cMap 的类只实例化它一次,没有任何设置或获取它的方法。

我看到 volatile 在这里提供的唯一一件事是,如果我将设置 cMap 以在不久的将来引用一个新对象,那么这些读取和写入将被同步.

我错过了什么吗?

最佳答案

volatile 修饰符与所涉及的类没有任何关系 - 它仅与变量 cMap 相关。它只影响线程获取或更改该变量值的方式。当您对引用的对象调用方法时,您已经超出了 volatile 的范围。

正如您所说,它基本上确保所有线程都能看到 cMap 值的更改(即,使其引用不同的 map )。

可能是个好主意——也可能不是,这取决于其余代码的作用。例如,如果你可以将它设为 final,你就不需要它是 volatile...

关于java - 使用 java.util.concurrent.Concurrent* 容器时使用 volatile 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3668462/

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