这在 Java 中是线程安全的吗?
Is this thread-safe in Java?
从可见性的角度来看,以下静态方法"contains"安全吗?
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 的正确内容吗?
我的想法是肯定的,因为它是最终引用,其中所有数据都添加到静态块中的集合中(并且以后不会更改)。
是的,那是线程安全的。 static
初始化块是 运行 当 class 被初始化时 that is done behind a lock。因此 mySet
在发布(可用)之前已完全初始化。所有线程都会看到它完全构建。
从可见性的角度来看,以下静态方法"contains"安全吗?
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 的正确内容吗?
我的想法是肯定的,因为它是最终引用,其中所有数据都添加到静态块中的集合中(并且以后不会更改)。
是的,那是线程安全的。 static
初始化块是 运行 当 class 被初始化时 that is done behind a lock。因此 mySet
在发布(可用)之前已完全初始化。所有线程都会看到它完全构建。