• 讨论在.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

  • 相关阅读:
    hdu 2709 Sumsets
    hdu 2004 成绩转换
    hihocoder 1043 完全背包
    hihocoder 1038 01背包
    hihocoder 1066 无间道之并查集
    并查集小结
    hdu 1232 畅通工程
    并查集学习2
    并查集知识学习
    js 禁止表单提交的方法(文件上传)
  • 原文地址:https://www.cnblogs.com/liuzhendong/p/2232062.html
Copyright © 2020-2023  润新知