单线程设计模式与线程安全
我读了同步创建新实例的原因是两个线程可以同时访问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
。