代码之家  ›  专栏  ›  技术社区  ›  JAN

这个Singleton是线程安全的吗?我看不出怎么回事?

  •  0
  • JAN  · 技术社区  · 9 年前

    考虑Singleton:

    public final class MySingleton {
        private static class Nested 
        {
            private static final MySingleton INSTANCE = new MySingleton();
        }
    
        private MySingleton() 
        {
            if (Nested.INSTANCE != null) 
            {
                throw new IllegalStateException("Already instantiated");
            }
        }
    
        public static MySingleton getInstance() 
        {
            return Nested.INSTANCE;
        }
    }
    

    我没有设置任何锁,但为什么这是Singleton问题的线程安全解决方案?

    1 回复  |  直到 9 年前
        1
  •  5
  •   Sotirios Delimanolis    9 年前

    我没有设置任何锁,但为什么这是一个线程安全的解决方案 辛格尔顿问题?

    因为类变量是在其声明类初始化时初始化的,而类是在锁后面初始化的。该过程在 Detailed Initialization Procedure Java语言规范的第章。

    当客户端代码调用 getInstance ,相应的线程将尝试访问 Nested.INSTANCE 如果 Nested 尚未初始化,当前线程将获取该类的初始化锁并对其进行初始化。初始化过程的一部分将初始化 final 类字段 INSTANCE .

    请注意,在您给出的示例中 嵌套的 类是的持有者 实例 ,你最好在 MySingleton