package GOGO;
/**
* 并发下的单例模式:
* 双端检索机制DCL(Double check Lock),但是可能会导致指令重排!!!!!线程不一定安全,依旧存在单例模式的隐患
* 可以加入volatile禁止指令重排
*/
public class SingletonDemo {
private static volatile SingletonDemo instance = null;//禁止创建对象时指令重排!!!!!!!!!
//构造器独一份
private SingletonDemo(){
//如果只有一个实例,该句话只被打印一次
System.out.println(Thread.currentThread().getName()+"\t 我是构造方法");
}
//双端检索机制DCL(Double check Lock),但是可能会导致指令重排!!!!!线程不一定安全,依旧存在单例模式的隐患,概率很低
public 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());
System.out.println("=======================");
//并发多线程,就会出现很多问题,会创建很多实例,可以对getInstance加synchronized,但是太重,并发效率降低
for (int i = 1; i < 10; i++) {
new Thread(()->{
SingletonDemo.getInstance();
},String.valueOf(i)).start();
}
}
}
并发下的单例模式完整解决方案
最新推荐文章于 2024-10-11 09:20:41 发布
探讨了在并发环境下单例模式的实现,通过双端检索机制DCL提高效率,但可能因指令重排导致线程安全问题。介绍了如何使用volatile关键字解决此问题,确保单例模式在多线程环境下的正确性和效率。
680

被折叠的 条评论
为什么被折叠?



