当前位置: 首页 > news >正文

浅谈单例的三种实现--C#

传统的double check :


public sealed class Singleton
{
    private static Singleton instance = null;
    private static readonly object padlock = new object();


    Singleton()
    {
    }


    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}


缺陷:
1.代码很臃肿
2.double check性能稍微差一些(比起后面的实现版本)




利用.net framework static特性的版本版:
public sealed class Singleton
{
    public static readonly Singleton instance = new Singleton();


    private Singleton()
    {
    }
}


1.如何保证单例和线程安全?
因为静态实例在AppDomain里面只有一份内存
2.缺陷?
静态构造函数在field之前执行,没有lazy(只有用的时候才实例)


lazy版本
public sealed class Singleton
{
    public static readonly Singleton instance = new Singleton();


    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }


    private Singleton()
    {
    }


}


改进的地方:
显示声明静态构造函数,告诉编译器,在field之后执行,这样就只有field被拿来用了,才会实例化

相关文章:

  • OO 编程基本功--(1)
  • 移动设备管理(MDM)与OMA(OTA)DM协议向导(一)——从WiMAX讲起
  • OO编程基本功(2)--命名
  • [IE编程] 如何设置IE8的WebBrowser控件(MSHTML) 的渲染模式
  • OO编程基本功(3) 注释
  • WinDBG 技巧:分析程序漏洞是否可以被利用 (!exploitable 命令)
  • 编程基本功(4)
  • Agile实践日志一 -- Grooming Session
  • 获取SQL Server服务器的连接信息用脚本(在原邹建写的基础上作一点改进)
  • Agile实践日志(2)-- Daily Stand up 和 Retrospective Session
  • 一短查询SQL Server服务器阻塞和死锁信息用的脚本
  • VB.Net 2005 WinFrom 文件上传程序...
  • 论道谈谈
  • WinDBG 技巧:设断点命令详解(bp, bu, bm, ba 以及bl, bc, bd, be)
  • Auto Complete -- Typeahead 和DateRangePicker
  • 【RocksDB】TransactionDB源码分析
  • docker-consul
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript 基本功--面试宝典
  • PHP的类修饰符与访问修饰符
  • SpringBoot 实战 (三) | 配置文件详解
  • Travix是如何部署应用程序到Kubernetes上的
  • vue--为什么data属性必须是一个函数
  • Web设计流程优化:网页效果图设计新思路
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 那些被忽略的 JavaScript 数组方法细节
  • 排序(1):冒泡排序
  • 我这样减少了26.5M Java内存!
  • 优秀架构师必须掌握的架构思维
  • 我们雇佣了一只大猴子...
  • ​ssh免密码登录设置及问题总结
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • !!Dom4j 学习笔记
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (笔试题)合法字符串
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (十六)一篇文章学会Java的常用API
  • (算法设计与分析)第一章算法概述-习题
  • (转)http-server应用
  • (转)程序员疫苗:代码注入
  • .apk文件,IIS不支持下载解决
  • .NET 4.0中的泛型协变和反变
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET框架设计—常被忽视的C#设计技巧
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • .project文件
  • @Autowired标签与 @Resource标签 的区别
  • @SuppressWarnings(unchecked)代码的作用
  • [AIGC] Kong:一个强大的 API 网关和服务平台