java - 这在Java中是线程安全的吗?

标签 java static thread-safety

从可见性的角度来看,以下静态方法“包含”是否安全?

    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/

相关文章:

c - 如何并发运行非线程安全的代码?

java - Jersey:将数据传递到 .jsp 页面

java - 状态模式中场注入(inject)的替代方案

java - final 以某种方式导致静态行为

.net - 在 IIS 中托管的 WCF 服务中使用非托管线程不安全库

java - ThreadPoolExecutor.execute() 的内存可见性保证

java - 如何通过电子邮件发送更大的数据

java - 比较2个二维数组JAVA

java - 在实例化子类之前检查子类的相关性?

java 。具有静态成员的嵌套类。我们如何规避它?