单例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,但还没有完成初始化。