单例模式在多线程下
分隔
public class SingletonDemo { private static SingletonDemo instance=null; private SingletonDemo(){} public static SingletonDemo getSingle() { if (instance==null) { instance=new SingletonDemo(); } return instance; } }分隔
public class SingletonDemo { private static SingletonDemo instance=null; private SingletonDemo(){ System.out.println("I am constructor"); } public static SingletonDemo getSingle() { if (instance==null) { instance=new SingletonDemo(); } return instance; } public static void main(String[] args) { for (int i=0; i<10; i++) { new Thread(() -> {SingletonDemo.getSingle(); },String.valueOf(i)).start(); } } }
分隔
public class SingletonDemo { private static SingletonDemo instance=null; private SingletonDemo(){ System.out.println("I am constructor"); } public static synchronized SingletonDemo getSingle() { if (instance==null) { instance=new SingletonDemo(); } return instance; } public static void main(String[] args) { for (int i=0; i<10; i++) { new Thread(() -> {SingletonDemo.getSingle(); },String.valueOf(i)).start(); } } }
分隔
DCL(Double Ckeck Lock)双端检锁机制
public static SingletonDemo getSingle() { if (instance==null) { synchronized(SingletonDemo.class) { if (instance==null) { instance=new SingletonDemo(); } } } return instance; }分隔
上面的代码是否一定正确呢?
不一定,指令重排
DCL(双端检索)机制不一定线程安全,
分隔
禁止指令重排
private static volatile SingletonDemo instance=null;