volatile单例模式的用法

  • 传统做法使用Synchronized完成单例模式
class SingleDemoOld{
    private  static  SingleDemoOld instance = null;
    private SingleDemoOld(){
        System.out.println(Thread.currentThread().getName()+"\t"+"构造方法SingleDemoOld");
    }
    public static synchronized SingleDemoOld getInstance(){
        if(instance == null){
            instance = new SingleDemoOld();
        }
        return instance;
    }
}


public class SingleDemo {
    public static void main(String[] args) {
        for(int i = 0;i<10;i++){
            new Thread(() ->{
                SingleDemoOld.getInstance();
            }).start();
            System.out.println(Thread.currentThread().getName()+"\t"+String.valueOf(i));
        }
    }
}
  • 使用volatile双端锁机制
class SingleDemoNew{
    private static  volatile SingleDemoNew instance = null;
    private  SingleDemoNew(){
        System.out.println(Thread.currentThread().getName()+"\t"+"构造方法SingleDemoNew");
    }
    public static SingleDemoNew getInstance(){
        if(instance ==null){
            synchronized (SingleDemoNew.class){
                if(instance == null){
                    instance = new SingleDemoNew();
                }
            }
        }
        return instance;
    }
}

public class SingleDemo {
    public static void main(String[] args) {
        for(int i = 0;i<10;i++){
            new Thread(() ->{
                SingleDemoNew.getInstance();
            }).start();
            System.out.println(Thread.currentThread().getName()+"\t"+String.valueOf(i));
        }
    }
}
发布了8 篇原创文章 · 获赞 7 · 访问量 209

猜你喜欢

转载自blog.csdn.net/weixin_39475445/article/details/104374401