C#中不需要用锁的线程安全的Singleton设计模式!
发布日期:2021-05-09 04:09:53 浏览次数:17 分类:博客文章

本文共 916 字,大约阅读时间需要 3 分钟。

典型的线程安全的Singleton实现是使用double-checked locking的实现,但是在.NET中我们并不需要使用double-checked locking就可以优雅地实现Singleton模式。

这个优美的Singleton实现基础是.NET对运行期初始化的完整定义。它的优美之处是不需要典型的double-checked locking。

当CLR加载classSingleton的时候,因为Singleton没有staticvariables需要被初始化,所以Singleton的初始化其实什么也没做。而对static classLazyHolder来说,直到它被执行的时候才会被初始化。而static classLazyHolder只有载Singleton.GetInstance()被执行的时候才会执行到。当第一次调用GetInstance()的时候CLR才会加载和初始化LazyHolder这个class。对于LazyHolder class的初始化就是对static variableInstance的初始化。而Instance的初始化就是执行Singleton的privateconstructor。因为.NET保证class的initialization是serial的,就是说在加载和初始化的过程中我们不需要自己做同步。因为初始化过程是一个serial的操作,所以对于后面的GetInstance,我们不需要做任何同步,它也会返回一个正确初始化的Singleton对象。

实现代码:

 1 
    
public
 
class
 Singleton
 2 
    {
 3 
        
private
 
static
 
class
 LazyHolder
 4 
        {
 5 
            
public
 
static
 
readonly
 Singleton Instance 
=
 
new
 Singleton();
 6 
        }
 7 
 8 
        
private
 Singleton()
 9 
        {
10 
        }
11 
12 
        
public
 
static
 Singleton GetInstance()
13 
        {
14 
            
return
 LazyHolder.Instance;
15 
        }
16 
    }

 

上一篇:Leaving Microsoft!!!
下一篇:C#中Dispose和Close的区别!

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年03月26日 17时56分56秒