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

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

单例的细分写法


本文提供全流程,中文翻译。
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; } //--}

END

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

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

你可能感兴趣的文章
微信小程序:模板消息推送实现
查看>>
CodePush自定义更新弹框及下载进度条
查看>>
自己总结的php开发中用到的工具
查看>>
小程序视频或音频自定义可拖拽进度条
查看>>
PHP导出超大的CSV格式的Excel表方案
查看>>
Mac 环境下如何生成Git shh key
查看>>
jenkins 使用磁盘检查插件 disk check plugin
查看>>
使用 Ruby 拓展 Vim
查看>>
centos7下安装LNMP(nginx+PHP7.1.9+mysql5.7)
查看>>
NodeAPI学习之Buffer
查看>>
深入java单例模式
查看>>
create-react-app
查看>>
20170812-XSS跨站脚本攻击
查看>>
Let’s Build |> 使用Elixir,Phoenix和React打造克隆版的Slack(part 1)
查看>>
如何让 StackNaivgator 实现越级回跳
查看>>
工具简述
查看>>
Hbase 集群搭建
查看>>
分布式文件服务器dfs
查看>>
正则表达式
查看>>
关于直播视频格式和浏览器兼容性历史的来龙去脉
查看>>