重学设计模式 - Double-Checked Locking模式

本文探讨了在多线程环境中,如何通过Double-Checked Locking模式来实现线程安全的单例,分析了该模式解决的问题、工作原理以及其在性能上的优势。

1、  意图

多线程中,创建线程安全的单件模式。

2、  问题

多线程中,Singleton模式并不总是正常工作的。

3、  解决方案

在检查到null或实例未创建之后进行“同步”,然后再检查一次,确保实例尚未创建

4、  效果

Singleton模式的变体,优化掉不必要的锁定,这种同步检查最多进行一次,因此不会成为瓶颈。

5、  实现

// .Net中通过MemoryBarrier 实现
public class MySingleton {
    private static object myLock = new object();
    private static MySingleton mySingleton = null;
    private static bool ready = false;
 
    private MySingleton() { 
    }
 
    public static MySingleton GetInstance() {
        if (!ready) { // 1st check
            lock (myLock) {
                if (!ready) { // 2nd (double) check
                    mySingleton = new MySingleton();
                    System.Threading.Thread.MemoryBarrier();    // fence
                    ready = true;
                }
            }
        }
        return mySingleton;
    }
}
// 使用C#关键字volatile实现,会降低效率
public class MySingleton {
    private static object myLock = new object();
    private static volatile MySingleton mySingleton = null;
 
    private MySingleton() { 
    }
 
    public static MySingleton GetInstance() {
        if (mySingleton == null) { // check
            lock (myLock) {
                if (mySingleton == null) { // double check, volatile ensures that the value is re-read
                    mySingleton = new MySingleton();
                }
            }
        }
        return mySingleton;
    }
}
// .net 4.0中可以使用Lazy<T>实现
public class MySingleton
{
    private static readonly Lazy<MySingleton> mySingleton = 
        new Lazy<MySingleton>(() => new MySingleton());
 
    private MySingleton()
    { }
 
    public static MySingleton GetInstance()
    {
        return mySingleton.Value;
    }
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值