最终的静态变量在Java中线程安全吗?
我已经阅读了很多,但还没有找到一个明确的答案。
我有一个看起来像这样的类:
public class Foo() {
private static final HashMap<String, HashMap> sharedData;
private final HashMap myRefOfInnerHashMap;
static {
// time-consuming initialization of sharedData
final HashMap<String, String> innerMap = new HashMap<String, String>;
innerMap.put...
innerMap.put...
...a
sharedData.put(someKey, java.util.Collections.unmodifiableMap(innerMap));
}
public Foo(String key) {
this.myRefOfInnerHashMap = sharedData.get(key);
}
public void doSomethingUseful() {
// iterate over copy
for (Map.Entry<String, String> entry : this.myRefOfInnerHashMap.entrySet()) {
...
}
}
}
我想知道从Foo实例访问sharededData是否是线程安全的(如构造函数和doSomethingUseful()所示)。Foo的许多实例将在多线程环境中创建。
我的意图是,sharedData 在静态初始值设定项中初始化,此后不进行修改(只读)。
我所读到的是,不可变对象本质上是线程安全的。但我只在实例变量的上下文中看到了这一点。不可变静态变量线程安全吗?
我发现的另一个结构是PropercurrentHashMap。我可以制作 ConcurrentHashMap 类型的 sharedData,但是它包含的 HashMaps 是否也必须是 ConcurrentHashMap 类型?基本上。。
private static final ConcurrentHashMap<String, HashMap> sharedData;
或
private static final ConcurrentHashMap<String, ConcurrentHashMap> sharedData;
还是会更安全(但简单地克隆()成本更高)?
this.myCopyOfData = sharedData.get(key).clone();
腾讯网.
(已编辑静态初始值设定项以提供更多上下文。