从可见性的角度来看,以下静态方法“包含”是否安全?
public class MyTest {
private static final HashSet<String> mySet= new HashSet<String>();
static {
mySet.add("cat");
mySet.add("dog");
mySet.add("bird");
}
public static boolean contains(String key) {
return mySet.contains(key);
}
}
那么如果多个线程调用 MyTest.contains(string) 他们能保证看到 mySet 的正确内容吗?
我的想法是肯定的,因为它是最终引用,其中所有数据都添加到静态 block 中的集合中(并且以后不会更改)。
最佳答案
是的,这是线程安全的。 static
初始化 block 在类初始化时运行,并且 that is done behind a lock 。因此,mySet
在发布(可用)之前已完全初始化。所有线程都会看到它完全构造完毕。
关于java - 这在Java中是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30315509/