单例模式

代码:

  第一种:

private static Singleton singleton = null;

private Singleton() { }

public static Singleton GetInstance
{
get
{
if (singleton == null)
{
singleton = new Singleton();
}
return singleton;
}
}

  第二种:

public class Singleton
{
private static readonly Singleton singleton = new Singleton(); private Singleton() { } public static Singleton GetInstance
{
get
{
return singleton;
}
}
}

  上面两种单例模式中,基本思路相同,将构造方法私有,建立私有的实例对象,提供公有的对象。第一种方法,外部每次调用时都会判断实例是否已经创建,第二种方法则是在一开始就将类的对象实例化好了,一直存在在内存中。区别也不大,单例的思想也就这么简单。这里要说的是下面这种方法。

public class Singleton
{
private static Singleton singleton = null; private static object flagobj = new object(); private Singleton() { } public static Singleton GetInstance
{
get
{
if (singleton == null)
{
lock (flagobj)
{
if (singleton == null)
{
singleton = new Singleton();
}
}
}
return singleton;
}
}
}

  这种实现方式和上面最多了一个object对象,然后看看GetInstance里有什么变化,思路很简单,多出来的object对象就是一个锁,其他地方访问的时候首先判断这个类是否有实例,没有实例就把"锁"给锁上,为什么要锁上呢?锁是为了怕"别人"使用,也就是应对多线程的情况了。然后我们再来看看为什么判断了两次当前实例引用是否为空呢?假设有两个线程a、b同时来到GetInstance,此时的singleton为null,那么都进去了,a把flagobj锁上,b就在外面等了,然后a再判断singleton是不是空引用,创建了一个实例,a走了之后b进来发现已经不是null了,就不再创建了,所以lock内的if是一定要存在的,那这时来看看为什么外面还要一个if呢?直接里面判断不是就好了嘛?这就是lock本身的问题了,要知道lock本身是一个相对耗时的操作,所以在外面加一个if,来规避过多的lock操作。三种方法,实习到目前为止,之前做的都是web的,那些很少用到多线程 ,唯一一次还是为了展示一下自己是会的才用的(然后我老大看到的时候并没有夸我。。),所以我大部分情况都还是用以上两种单例模式。

设计模式C#合集--单例模式的更多相关文章

  1. 设计模式C#合集--工厂方法模式

    简单工厂,代码: public interface ISpeak { public void Say(); } public class Hello : ISpeak { public void Sa ...

  2. 设计模式C#合集--抽象工厂模式

    抽象工厂,名字就告诉你是抽象的了.上代码. public interface BMW { public void Drive(); } public class BMW730 : BMW { publ ...

  3. GoF设计模式合集

    1 概述 这篇文章是对GoF23种设计模式+1种非GoF模式的合集,由笔者自己的笔记整理而来,每个模式都详细描述了步骤,角色等,以及使用Java实现的具体的例子. 2 基础 设计模式概述 UML与面向 ...

  4. Go设计模式学习准备——下载bilibili合集视频

    需求 前段时间面试,被问到设计模式.说实话虽然了解面向对象.多态,但突然被问到设计模式,还要说清解决什么问题,自己是有些懵的,毕竟实习主要工作是在原项目基础进行CRUD,自己还是没有深度思考,所以只能 ...

  5. 【死磕Java并发】----- 死磕 Java 并发精品合集

    [死磕 Java 并发]系列是 LZ 在 2017 年写的第一个死磕系列,一直没有做一个合集,这篇博客则是将整个系列做一个概览. 先来一个总览图: [高清图,请关注"Java技术驿站&quo ...

  6. Struts+Hibernate+Spring面试题合集及答案

    Struts+Hibernate+Spring面试题合集及答案 Struts+Hibernate+Spring面试题合集 1 1. Hibernate部分 2 1.1. Hibernate工作原理 2 ...

  7. Struts+Hibernate+Spring面试题合集及答案(转)

    Struts+Hibernate+Spring面试题合集及答案 Struts+Hibernate+Spring 面试题合集 1 1. Hibernate部分 2 1.1. Hibernate工作原理 ...

  8. 大量Javascript/JQuery学习教程电子书合集

    [推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人   不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pd ...

  9. 你想找的Python资料这里全都有!没有你找不到!史上最全资料合集

    你想找的Python资料这里全都有!没有你找不到!史上最全资料合集 2017年11月15日 13:48:53 技术小百科 阅读数:1931   GitHub 上有一个 Awesome - XXX 系列 ...

随机推荐

  1. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  2. 【.net 深呼吸】细说CodeDom(5):类型成员

    前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...

  3. Javascript生成二维码(QR)

    网络上已经有非常多的二维码编码和解码工具和代码,很多都是服务器端的,也就是说需要一台服务器才能提供二维码的生成.本着对服务器性能的考虑,这种小事情都让服务器去做,感觉对不住服务器,尤其是对于大流量的网 ...

  4. Android学习路线总结,绝对干货

    title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...

  5. scp报错 -bash: scp: command not found

    环境:RHEL6.5 使用scp命令报错: [root@oradb23 media]# scp /etc/hosts oradb24:/etc/ -bash: scp: command not fou ...

  6. CSS 3 学习——transform 3D转换渲染

    以下内容根据官方规范翻译,没有翻译关于SVG变换的内容和关于矩阵计算的内容. 一般情况下,元素在一个无景深无立体感的平面(flat plane)上渲染,这个平面就是其包含块所处的平面.同时,页面上的其 ...

  7. C# 对象实例化 用json保存 泛型类 可以很方便的保存程序设置

    参考页面: http://www.yuanjiaocheng.net/webapi/test-webapi.html http://www.yuanjiaocheng.net/webapi/web-a ...

  8. BPM体系文件管理解决方案分享

    一.方案概述 企业管理在很大程度上是通过文件化的形式表现出来,体系文件管理是管理体系存在的基础和证据,是规范企业管理活动和全体人员行为,达到管理目标的管理依据.对与公司质量.环境.职业健康安全等体系有 ...

  9. android计算每个目录剩余空间丶总空间以及SD卡剩余空间

    ublic class MemorySpaceCheck { /** * 计算剩余空间 * @param path * @return */ public static String getAvail ...

  10. 数据分布转换:非正态 -> 正态

    来源:丁香园论坛:SPSS上的把非正态分布数据转换为正态分布数据 一楼 可以应用变量变换的方法,将不服从正态分布的资料转化为非正态分布或近似正态分布.常用的变量变换方法有对数变换.平方根变换.倒数变换 ...