定义确保一个类仅有一个实例,并提供一个访问它的全局访问点

优点:在内存中只有一个对象,节省了内存空间

示例

Singleton.cs

写法一:非线程安全

 public class Singleton
{
//声明一个静态的类变量
private static Singleton singleton; /// <summary>
/// 私有构造函数,避免外部代码new实例化对象
/// </summary>
private Singleton()
{ } /// <summary>
/// 实例化对象
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
if (singleton == null)
{
singleton = new Singleton();
} return singleton;
}
}

写法二:简单线程安全
    多线程程序中,多个线程同时访问Singleton类,调用GetInstance()方法,可能会创建多个对象,这种情况我们该如何处理呢?

遇到这种情况我们可以给进程上一把锁(lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放[MSDN])。

 public class Singleton
{
//声明一个静态的类变量
private static Singleton singleton;
//程序运行时创建一个静态只读进程辅助对象
private static readonly object syncRoot = new object(); /// <summary>
/// 私有构造函数,避免外部代码new实例化对象
/// </summary>
private Singleton()
{ } /// <summary>
/// 实例化对象
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
lock (syncRoot)
{
if (singleton == null)
{
singleton = new Singleton();
}
} return singleton;
}
}

  

写法三:双重锁定线程安全

 public class Singleton
{
//声明一个静态的类变量
private static Singleton singleton;
//程序运行时创建一个静态只读进程辅助对象
private static readonly object syncRoot = new object(); /// <summary>
/// 私有构造函数,避免外部代码new实例化对象
/// </summary>
private Singleton()
{ } /// <summary>
/// 实例化对象
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
//先判断实例是否存在,不存在再加锁处理
if (singleton==null)
{
lock (syncRoot)
{
if (singleton == null)
{
singleton = new Singleton();
}
}
} return singleton;
}
}

 客户端调用:

 protected void Page_Load(object sender, EventArgs e)
{
Singleton singleton1 = Singleton.GetInstance();
Singleton singleton2 = Singleton.GetInstance(); if (singleton1 == singleton2)
{
Response.Write("两个对象是同一个示例");
}
}

测试结果

输出:两个对象是同一个示例

设计模式:单例模式(Singleton)的更多相关文章

  1. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  2. 设计模式 单例模式(Singleton) [ 转载 ]

    设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...

  3. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

  4. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  5. [工作中的设计模式]单例模式singleton

    一.模式解析: 单例模式是最简单和最常用的设计模式,面试的时候,不管新毕业的学生还是已经工作多年的筒子,对单例模式基本都能聊上两句.单例模式主要体现在如下方面: 1.类的构造函数私有化,保证外部不能直 ...

  6. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  7. 设计模式--单例模式Singleton(创建型)

    单例模式很显然是定义一个类,这个类在程序中只有唯一的实例对象.一般单例类的构造函数是私有的,只能通过调用静态函数GetInstance来获取实例. 一.单例模式有三种:懒汉式单例.饿汉式单例.登记式单 ...

  8. 设计模式--单例模式Singleton

    单例模式顾名思义整个程序下只有一个实例,例如一个国家只有一个皇帝,一个军队只有一个将军.单例模式的书写又分为饿汉模式和懒汉模式 饿汉模式   类中代码 package demo; public cla ...

  9. 设计模式——单例模式(Singleton)

    保证一个类仅有一个实例,并提供一个访问它的全局访问点.——DP UML类图 模式说明 个人认为单例模式是所有设计模式中最为简单的一个模式,因为实现这个模式仅需一个类,而不像其他模式需要若干个类.这个模 ...

  10. 设计模式-单例模式(Singleton) (创建型模式)

    //以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Singleton.h #pragma once #include<iostream> class Sin ...

随机推荐

  1. bzoj1019 [SHOI2008]汉诺塔

    1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1030  Solved: 638[Submit][Status] ...

  2. c++ map和mutimaps 插入值

    (1)运用value_type std::map<std::string, float> col1; col1.insert(std::map<std::string,float&g ...

  3. POJ 1691 Painting A Board(迭代深搜)

    题目链接 调了一上午,单步的效率太低了,特别是在有递归的情况下...下午来了,输出调试了下,就发现bug了,各种混乱啊. 比较高兴的事,1Y了.本来还准备用edge1优化一下的,结果完全没用到.. # ...

  4. java开源网站

    1.http://www.java1234.com 2.http://www.2cto.com/Soft/

  5. mysql用户权限

    mysql> show grants for root@'localhost';+-------------------------------------------------------- ...

  6. Hadoop如何恢复被删除的文件

    hadoop的hdfs中被删除文件的恢复原理和回收站原理是一样的,就是在删除hdfs文件时,被删除的文件被移动到了hdfs的.Trash文件夹中,恢复时只需将该文件夹中文件拿出即可.具体操作如下: 1 ...

  7. 【产品更新】EVC8013 硬件更新!

    EVC8013 三合一磁耦合隔离转换器(USB转RS-232 / RS-485 / RS-422 ),迎来一次硬件大幅度升级,升级不加价! 本次升级主要有以下几个方面: 1.采用第二代金升阳 3000 ...

  8. 分布式架构高可用架构篇_07_MySQL主从复制的配置(CentOS-6.7+MySQL-5.6)

    参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...

  9. java字符串抉择

    下面我们就字符串连接方面分析. 1.String 打开String的源码,如图所示 会发现存储字符串的字符数值是final常量.再看String的构造方法,发现String的value值在构造方法就确 ...

  10. SQL判断语句用法和多表查询

    1.格式化时间sql语句 本例中本人随便做了两张表,和实际不是很相符,只是想说明sql语句的写法. 例1表格式如下: 需求:查询出本表,但需要使time字段的时间格式为yyyy-MM-dd,比如:20 ...