这在 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 在发布(可用)之前已完全初始化。所有线程都会看到它完全构建。