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

单例模式常用是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());
}
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值