单例模式的三种优雅实现方法

单例模式常用是Double Check

public class singletonObject{
    private static singletonObject instance;
    private singletonObject(){}
    public static singletonObject getInstance(){
        if(null==instance){
            sysnchronized(singletonObject.class){
                if(null==instance){
                    instance=new singletonObject();
                }
            }
        }
        return instance;
    }
}

这个既可以实现延迟加载和性能的提高,但是会有一个危险,但实例化内容较多时,进行到一半另一个线程就返回了,这个时候就会造成空指针异常

优雅解决这个问题的三种方法:

使用关键字volatile

用来确保将变量的更新操作通知到其他线程,具体如下:

public class singletonObject{
    private static volatile singletonObject instance;
    private singletonObject(){}
    public static singletonObject getinstance(){
        if(null==instance){
            sysnchronized(singletonObject.class){
                if(null==sysnchronized){
                    instance=new singletonObject();
                }
            }
        }
        return instance;
    }
}

加一个静态类来实现实例化

public class singletonObject{
    private singletonObject(){}
    private static class InstanceHolder{
        private final static singletonObject instance=new singletonObject();
    }
    public static singletonObject(){
        return  InstanceHolder.instance;
    }
}

枚举法
这个即保证了性能又绝对的安全 ,枚举是线程安全的

packagecom.dmsdbj.itoo.teachingManagement.service.impl;

importsun.swing.plaf.synth.DefaultSynthStyle;

importjava.util.stream.IntStream;

/**
*CreatedbyAdministratoron2018/4/180018.
*/
publicclassSingletonObject{
    privateSingletonObject(){}
    public enum Singletos{
        INSTANCE;
        private final SingletonObject instance;
        Singletos(){
        instance=new SingletonObject();
    }
    public SingletonObjectget Instance(){
    return instance;
}

}
public static SingletonObjectget Instance(){
    return Singletos.INSTANCE.getInstance();
}
public static void main(String[]args){
     IntStream.rangeClosed(1,100).forEach(i->newThread(String.valueOf(i)){
     @Override
     public void run(){
     System.out.print(SingletonObject.getInstance()+"\n");
}
}.start());
}
}

让我们多学习优秀的代码,做一个安静的优秀美男子

猜你喜欢

转载自blog.csdn.net/ljm15832631631/article/details/80006043