单例模式的性能与线程安全详解(为什么要双重检查锁)

文章探讨了懒汉式和饿汉式两种单例模式的性能和线程安全性。懒汉式通过双重判空和同步锁保证线程安全,但可能会增加不必要的同步开销。饿汉式则在类加载时即完成实例化,提供高效且线程安全的单例,前提是构造函数无大开销且this不被外部引用。
摘要由CSDN通过智能技术生成

我们常用的单例模式一般是两种 1.懒汉式单例    2.饿汉式单例。那么他们的性能如何,线程安全又如何呢?

1.懒汉模式

private static Singleton mInstance;
public static Singleton getInstance() {  
    if (mInstance == null) {//一重判空 
        synchronized (Singleton.class) {    
           if (mInstance == null) {//二重判空 
              mInstance = new Singleton();   
           }    
        }    
    }    
    return mInstance ;   
}

双重判空的意义在于,mInstance是静态变量,是线程不安全的。那么我们通过同步锁synchronized来锁定改类。如果不加第一个判空,那么每次调用getInstance()都会调一下同步锁,那么开销是很大的。如果加了第一个判空,那么大概率是只会调用一次同步锁。

        所以双重锁是用来降低同步锁的调用次数的,是提升代码执行效率的。

2.饿汉式单例

        除了双重锁,其实更好的是饿汉模式单例。

public class Singleton {

        private static final Singleton mInstance = new Singleton();

}

直接在类加载的时候就调用实例化,如果构造函数里面没有开销太大的操作,并且执行构造函数时this没有被传给外部其他线程引用,那么饿汉模式就是非常好的。

首先,final类变量型基本上是线程安全的(构造函数this没有被传给外部其他线程引用),所以不需要同步锁,也不需要麻烦的判空,所以性能是很高的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闽农qq:994955138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值