单例模式之线程安全的懒汉模式

        在上一篇文章中,单例模式:饿汉模式和懒汉模式中说了懒汉模式的优点和缺点,为了弥补懒汉模式的缺点,使用双重校验和volitile来保证懒汉模式的线程安全

public class Singleton {
    //私有化构造方法
    private Singleton(){};
    //创建空的对象实例
    private static volatile Singleton singleton=null;
    public static Singleton createSingleton(){
        if (singleton==null){
            synchronized (Singleton.class){
                if (singleton==null){
                    singleton=new Singleton();
                }
            }
        }
        return singleton;
    }
}
  1. 私有化构造方法,使得该对象只能在本类中被创建出来,而在类外无法被创建,维持该类的单例
  2. 创建空的对象实例,创建空的对象实例,用来存储创建出来的对象,同时使用volatile修饰,是为了保证代码编译的顺序性和监视对象,保证高并发的时候,能够同步所有请求中,关于该实例中的状态,保证单例和对象的一致性。
  3. 创建公共的静态创建单例的方法,获得该对象的实例对象

在公共的静态创建单例的方法,使用synchronized进行同步,保证线程安全。

方法中的第一个判空的原因?

实例总是使用的时候多于被创建的时候,这个实例只会被创建一个,但是会被使用多次,如果没有第一个判空,那么每一次请求都会进入同步锁中,会造成线程消耗的时间长,影响性能

方法中会存在第二个判空的原因?

当实例对象没有被创建时,如果出现高并发请求,多个请求获取实例,此时的请求中的对象都为空,第一个判空都能够成功,如果没有第二个判空的话,在同步锁外等待的请求在第一个实例完成之后,依然会进入创建一个实例,这样就不符合单例模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值