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

一般写法

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= ;i< ;i++){
Thread thread =new Thread(new Runnable(){
@Override
public void run() {
DCLSingle.getDCLSingle();
} });
thread.start();
}
} }

测试结果如下:

单例DCL模式-LMLPHP

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

05-26 11:38