单例模式

代码:

  第一种:

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. Fis3前端工程化之项目实战

    Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...

  2. 【AR实验室】mulberryAR : ORBSLAM2+VVSION

    本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...

  3. 微信企业号 获取AccessToken

    目录 1. AccessToken介绍 2. 示例代码 1. AccessToken介绍 1.1 什么是AccessToken AccessToken即访问凭证,业务服务器每次主动调用企业号接口时需要 ...

  4. 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文

    阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...

  5. Win10 IIS本地部署MVC网站时不能运行?

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 部署后出现这个错误: 打开文件目录后发现是可以看见目录的,静态页面也是可以打开的 ...

  6. shell简介

    Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...

  7. OpenCASCADE BRep Projection

    OpenCASCADE BRep Projection eryar@163.com 一网友发邮件问我下图所示的效果如何在OpenCASCADE中实现,我的想法是先构造出螺旋线,再将螺旋线投影到面上. ...

  8. 一篇文章看懂TPCx-BB(大数据基准测试工具)源码

    TPCx-BB是大数据基准测试工具,它通过模拟零售商的30个应用场景,执行30个查询来衡量基于Hadoop的大数据系统的包括硬件和软件的性能.其中一些场景还用到了机器学习算法(聚类.线性回归等).为了 ...

  9. VS2015在创建项目时的一些注意事项

    一.下面是在创建一个新的项目是我最常用的,现在对他们一一做一个详细的介绍: 1.Win32控制台应用程序我平时编写小的C/C++程序都用它,它应该是用的最多的. 2.名称和解决方案名称的区别:名称是项 ...

  10. ecshop验证码

    <?php //仿制ecshop验证码(四位大写字母和数字.背景) //处理码值(四位大写字母和数字组成) //所有的可能的字符集合 $chars = 'ABCDEFGHIJKLMNOPQRST ...