Java 中的线程安全单例
2022-09-01 00:37:10
维基百科上关于单例的文章提到了一些在Java中实现结构的线程安全方法。对于我的问题,让我们考虑具有冗长的初始化过程并且同时由许多线程访问的单例。
首先,这个未提及的方法是否线程安全,如果是这样,它同步什么?
public class Singleton {
private Singleton instance;
private Singleton() {
//lots of initialization code
}
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
其次,为什么以下实现线程在初始化时是安全的和懒惰的?如果两个线程同时进入该方法,究竟会发生什么情况?getInstance()
public class Singleton {
private Singleton() {
//lots of initialization code
}
private static class SingletonHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
最后,在第二个示例中,如果一个线程首先获取一个实例,另一个线程获取一个实例并尝试在第一个线程中构造函数完成之前对其执行操作,该怎么办?那么你能进入一个不安全的状态吗?