单例模式在多线程下

分隔
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;

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务