public class SingletonDemo {
private static volatile SingletonDemo instance = null;
private SingletonDemo (){
System.out.println(Thread.currentThread().getName() + "\\t 我是构造方法SingletonDemo ()");
}
// DCL (double check lock)双端检锁机制 由于存在指令重排 所以还不是完全安全 需要加入 volatile
private static SingletonDemo getInstance(){
if(instance == null){
synchronized (SingletonDemo.class){
if(instance == null){
instance = new SingletonDemo();
}
}
}
return instance;
}
public static void main(String[] args) {
// 单线程模式没问题
// System.out.println(SingletonDemo.getInstance() == SingletonDemo.getInstance());
// System.out.println(SingletonDemo.getInstance() == SingletonDemo.getInstance());
// System.out.println(SingletonDemo.getInstance() == SingletonDemo.getInstance());
// 多线程 不能维持单例模式
for(int i = 1; i <= 10; ++i){
new Thread(() -> {
SingletonDemo.getInstance();
}, String.valueOf(i)).start();
}
}
}