public class LazySingleton {
//private:将这个对象私有化,不让外部直接访问,同时提供getInstance()方法来获得单例对象。
// static:如果没有这个static的话getInstance函数中的hungerSingleton出现错误,获取不到对象。
// 因为此时还没有创建实例,要想在类中使用到hungerSingleton,就要加上static使其变成类变量。
//volatile:防止指令重排序。
// final也可以防止指令重排序,为什么不用final而使用volatile?
// 声明为final的变量,必须在类加载完成时已经赋值, 是什么意思呢?
//就是,如果你是final非static成员,必须在构造器、代码块、或者直接定义赋值;
//如果是final static 成员变量,必须直接赋值 或者在 静态代码块中赋值。
//然而直接赋值 或 静态代码块中赋值 就变成饿汉模式了,
//所以懒汉模式中,不能用final修饰
private static volatile LazySingleton lazySingleton ;
public static LazySingleton getInstance() {
if(lazySingleton==null)
//synchronized同步代码段的时候需要提供锁,选择LazySingleton.class将这个类锁住!
synchronized (LazySingleton.class) {
if (lazySingleton == null)
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
//private:将这个对象私有化,不让外部直接访问,同时提供getInstance()方法来获得单例对象。
private LazySingleton() {
}
public static void main(String[] args) {
for(int i=0;i<10;i++){
new Thread(()->{
System.out.println(LazySingleton.getInstance());
}).start();
}
}
}