class Singleton2 {
//由于是懒汉模式,不会立即创建实例,而是会有用到时才会创建,
//为防止内存可见性问题,所以加volatile修饰,保证instance内存可见
private volatile static Singleton2 instance = null;
//为防止程序猿new多个实例,所以把构造方法设为private
private Singleton2() {};
//提供类方法,供程序猿获得唯一实例
//为缓解锁竞争,在最外层加一层判断,同时该instance需要内存可见,故用到上述的volatile修饰instance
public static Singleton2 getInstance() {
if (instance == null) {
//条件成立,说明未实例化,存在线程安全问题,需要加锁
synchronized (Singleton2.class) {
//若未实例化,就创建一个实例,该条件只会对第一个拿到锁的线程成立
if (instance == null) {
instance = new Singleton2();
}
}
}
return instance;
}
}
public class Demo2 {
Singleton2 instance = Singleton2.getInstance();
//由于是单例模式,所以下方代码会报错,只能通过类方法获得单例
//Singleton2 instance2 = new Singleton2();
}