博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#单例的多种写法
阅读量:7067 次
发布时间:2019-06-28

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

单例的细分写法


本文提供全流程,中文翻译。
Chinar坚持将简单的生活方式,带给世人!
(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)

1

最吊大的 一种——C#这样的高级语言特有的,实在懒得出奇

/// /// 单例类/// public class Singleton{    private Singleton() { }    public static readonly Singleton instance = new Singleton();}

2

比较常用,且方便的一种

public class Singleton {    //定义公有变量,提供全局访问    public static Singleton instance;    //Start开始前执行函数    public void Awake()    {        //容错        if (instance!=null)        {            Destroy(instance);        }        else        {            instance = this;        }    }    //--}

3

public class Singleton{    //静态,保存类的实例    private static Singleton instance;    //公有变量    public static Singleton Instance    {          //匿名函数         get //赋值        {            if (instance == null)            {                instance = new Clients();            }            return instance;        }    }    //--}

4

第四种:单线程单线程-单例模式的实现:(单线程,是完美的;多线程会生成多个实例 uniqueInstance )

以下引用自:

public class Singleton{    // 定义一个静态变量来保存类的实例    private static Singleton uniqueInstance;    // 定义私有构造函数,使外界不能创建该类实例    private Singleton()    {    }    ///     /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点    ///     /// 
public static Singleton GetInstance() { // 如果类的实例不存在则创建,否则直接返回 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } //--}

5

第五种 ——单锁-多线程-单例模式的实现:(多线程,单加锁,但因每次判定 locker 。故增加了额外的开销,损失了性能)

public class Singleton{    // 定义一个静态变量来保存类的实例    private static Singleton uniqueInstance;    // 定义一个标识确保线程同步    private static readonly object locker = new object();    // 定义私有构造函数,使外界不能创建该类实例    private Singleton()    {    }    ///     /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点    ///     /// 
public static Singleton GetInstance() { // 当第一个线程运行到这里时,此时会对locker对象 "加锁", // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁 // lock语句运行完之后(即线程运行完之后)会对该对象"解锁" lock (locker) { // 如果类的实例不存在则创建,否则直接返回 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } return uniqueInstance; } //--}

6

第六种 ——双重锁定-多线程-单例模式的实现:(多线程,双重锁定,但因每次判定 locker 。故增加了额外的开销,损失了性能

public class Singleton{    // 定义一个静态变量来保存类的实例    private static Singleton uniqueInstance;    // 定义一个标识确保线程同步    private static readonly object locker = new object();    // 定义私有构造函数,使外界不能创建该类实例    private Singleton()    {    }    ///     /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点    ///     /// 
public static Singleton GetInstance() { // 当第一个线程运行到这里时,此时会对locker对象 "加锁", // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁 // lock语句运行完之后(即线程运行完之后)会对该对象"解锁" // 双重锁定只需要一句判断就可以了 if (uniqueInstance == null) { lock (locker) { // 如果类的实例不存在则创建,否则直接返回 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } //--}

支持

May Be —— 搞开发,总有一天要做的事!

拥有自己的服务器,无需再找攻略!
Chinar 提供一站式教程,闭眼式创建!
为新手节省宝贵时间,避免采坑!

1 ——
2 ——
3——
4 ——


70
技术交流群:806091680 ! Chinar 欢迎你的加入


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

转载于:https://www.cnblogs.com/chinarbolg/p/9601482.html

你可能感兴趣的文章
Tigase XMPP Server源码部署
查看>>
Intellij IDEA创建Maven Web项目
查看>>
java 7 入门书籍
查看>>
Android Pdf文档的生成、显示与打印
查看>>
SpringMVC三种异常处理方式
查看>>
w命令
查看>>
golang使用oracle碰到go/lib/time/zoneinfo.zip: no such file or directory
查看>>
quartz定时任务时间设置描
查看>>
ES6常用语法
查看>>
https://www.jianshu.com/p/dbffae16ba0b
查看>>
微信,QQ这类IM app怎么做——谈谈Websocket
查看>>
在Ubuntu 11.04中安装Openresty
查看>>
JAVA常见的面试题
查看>>
《Python高效开发实战》实战演练——建立应用2
查看>>
java: -source 1.6 中不支持 switch 中存在字符串.....
查看>>
Confluence 6 空间
查看>>
lua-resty-http上传数据
查看>>
heartbeat+ldirectord实现web与dns的高可用性
查看>>
luacurl安装
查看>>
JBoss的配置
查看>>