单例DCL模式

单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。

一般写法

public class DCLSingle {
    
    public static  DCLSingle  instance= null;

    private DCLSingle(){
        System.out.println("DCLSingle create");
    }
    
    public static DCLSingle getDCLSingle(){
        if (instance == null){
            instance = new DCLSingle();
        }
        
        return instance;
    }

}

上述写法在高并发环境下存在安全问题,比如通过200个线程同时获取DCLSingle单例对象,但会创建多个实例。

public class DCLSingleTest {
    
    public static void main(String[] args){
        for(int i= 0 ;i<200 ;i++){
            Thread thread =new Thread(new Runnable(){
                @Override
                public void run() {
                    DCLSingle.getDCLSingle();
                }
                
            });
            thread.start();
        }
    }
    
}

 测试结果如下:


DCL单例模式可以很好的解决上述高并发环境下的安全性问题。

public class DCLSingle {
    
    public static volatile DCLSingle  instance= null;

    private DCLSingle(){
        System.out.println("DCLSingle create");
    }
    

    public static DCLSingle getDCLSingle(){
        
        if (instance == null){
            synchronized(DCLSingle.class){
                if(instance == null){
                    instance = new DCLSingle();
                }
            }
        }
        
        return instance;
        
    }
    
}

其中添加修饰符volatile,为了防止instance在创建过程中编译器或处理器对指令重排序,导致有的线程获取的instance对象不为null,但还没有完成初始化。

 

posted @ 2019-06-13 16:35  小亮的BLOG  阅读(774)  评论(0编辑  收藏  举报