讨论在.NET 中通过静态初始化实现Singleton的一个致命缺点

有不少很好的文章介绍过这个主题了,因此也就不再赘述怎么实现了,都在下面的参考资料里了,一看便知。

 

我想说的这个缺点是静态构造函数有可能发生异常,一旦静态构造函数引发异常,不仅会导致访问失败,而且依照静态构造函数只运行一次的特点,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化,导致访问失败,也就是说,第一次运行失败后,就没有再修复错误的机会了。

 

举例来说,如果想将数据库中的某些公用数据,比如菜单,或某些权限之类的,将他们放在单例中,或者进一步将单例的数据缓存到memcached或appfabric中方便后续使用之时,假如数据库当前不可用,或者缓存服务当前不可用等等缘故,取数据或存缓存的动作失败,静态构造函数就会出现异常,也就出现了无法访问系统的情况,如果是web系统,则非要重起应用程序池或者www服务才能解决问题。


所以,我想静态初始化也许不太适合用在需要读取数据库,存储缓存等场合,这些场合出状况的可能性比较大,比如数据库和网站在不同的机器上,如果数据库和网站服务器同时重起,网站服务器启动快,数据库服务器启动慢,则网站提供服务之时数据库还不可用,这样,此时一旦有人访问网站,静态构造函数开始初始化,遇到异常,之后就无法修复了,无论后续谁访问,无论数据库是否已经可用,系统都直接给你返回错误。


因此,在这种情况下,还是用lock的比较传统的单例实现模式比较更可靠些,起码一次不成功后还有再修复错误的机会。

 

不知各位以为如何?


参考资料: 

静态构造函数(C# 编程指南)
http://msdn.microsoft.com/zh-cn/library/k9x6w0hc(v=VS.100).aspx


Singleton
http://msdn.microsoft.com/zh-cn/library/ms998426.aspx


在 C# 中实现 Singleton
http://msdn.microsoft.com/zh-cn/library/ms998558.aspx

 

Static constructors and way forward (.NET optimized Singleton pattern)
http://www.codeproject.com/KB/architecture/StaticCtor_Singleton.aspx

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值