单线程设计模式与线程安全

我读了同步创建新实例的原因是两个线程可以同时访问getInstance并发现_instance为null,并创建两个Singleton类的实例。 所以为了消除我们的同步。 但是再次介绍如何再次引入双重检查的锁定方法,以检查Synchronized块内的实例是否为null。 这是否有必要? 一旦代码块被同步,它已经线程安全知道了吗?

public class Singleton {
        private static Singleton _instance = null;

        private Singleton() {   }

        public static Singleton getInstance() {
                if (_instance == null) {
                      synchronized (Singleton.class) {
                          _instance = new Singleton(); // why need to again check null
                      }
                }
                return _instance;
        }
} 

synchronized块将按顺序执行(即一次一个线程),但这还不够,因为第二次调用_instance = new Singleton()可能会覆盖第一个。

如果在第一个线程评估_instance == null表达式之后立即发生上下文切换,并且在另一个线程评估_instance == null表达式之前不发生其他上下文切换,那么这是一种合理的情况。

因此,一旦在synchronized块中,当前线程必须确保_instance在将其设置为new Singleton()之前仍然为null

链接地址: http://www.djcxy.com/p/91823.html

上一篇: singleton design pattern with thread safe

下一篇: Thread Safe Singletons in Java