单例模式(Singletion):保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。

  单例模式主要作用是保证唯一的实例,可以严格地控制客户端怎样访问该实例以及何时访问它。可以简单的理解为对唯一实例的受控访问。

      Singleton   
-instance:Singleton 

-Singleton()

+GetInstance()

  Singleton类作为我们要进行单例操作的类,在类中定义一个静态的GetInstance操作函数,允许客户端访问其唯一实例,主要用于创建自己的唯一实例。

public class Singleton
{
private static Singleton Instance; private Singleton() { } public static Singleton GetInstance()
{
if (Instance == null)
{
Instance = new Singleton();
}
return Instance;
}
}

客户端调用

Singleton singleton = Singleton.GetInstance();

以上为简单的单例模式的示例,在单线程程序中可以很好的完成任务。而当我们的程序为多线程时就可能出现问题。

  在多线程程序中,当多个线程同时访问GetInstance()时就可能产生多个实例。因此在多线程程序中需要对我们的单例类进行进一步的完善:

public class Singleton
{
private static Singleton Instance;
private static readonly object syncRoot = new object(); private Singleton() { } public static Singleton GetInstance()
{
if (Instance == null)----------先判定是否是否存在实例,如存在则直接返回,避免无用的加锁影响性能。
{
lock (syncRoot)
{
if (Instance == null)----------双重加锁
{
Instance = new Singleton();
}
}
}
return Instance;
}
}

另外C#与公共语言运行库也提供了一种静态初始化方法,不需要我们显式的编写线程安全代码,即可以解决多线程程序中不安全的问题。

    public sealed class Singleton----封闭类,不能被集成
{
private static readonly Singleton instance = new Singleton();-----readonly标示了该实例只能在初始化中分配。 private Singleton() { } public static Singleton GetInstance()
{
return instance;
}
}

  这种静态初始化方式只在类被加载的时候将类实例化,因此被称为饿汉式单例模式。之前的两种写法都是在第一次被引用的时候才会将类实例化,因此被称为懒汉式单例模式。

饿汉式单例模式在程序加载该类的时候就对类进行了初始化,这时候我们可能并不会马上使用,所以会提前占用系统的资源。但是懒汉式单例模式则需要考虑多线程不安全问题,对类实例化

的过程进行双重加锁以保证实例化的安全。两种方式各有好处,具体需要根据我们在开发的时候根据应用的具体场景需求选择最佳的单例模式。

最新文章

  1. python语言中的编码问题
  2. MyEclipse运行前自动保存
  3. 队列的C++实现(数组)——创建-进队-出队-返回队首元素-清空队列栈-处理队列
  4. Android渠道汇总
  5. python 获取文件大小,创建时间和访问时间
  6. 使用angular的ng-repeat遇到的一个问题
  7. [Webpack 2] Ensure all source files are included in test coverage reports with Webpack
  8. onConfigurationChanged与OnCreate,究竟谁被调用的问题
  9. MIT Introduction to Computer Science and Programming (Lesson one )
  10. js求两个数的最大公约数
  11. java thread 线程锁同步,锁,通信
  12. 欧朋Opera 浏览器(打不开百度)提示“您的连接不是私密连接”,解决办法
  13. MySQL多表查询练习题
  14. Redis基础认识及常用命令使用(一)--转载
  15. ftp 传输数据:命令链路连接方法是一样的,而数据链路的建立方法就完全不同
  16. LVM常规操作记录梳理(扩容/缩容/快照等)
  17. Matplotlib新手上路(下)
  18. P1382 楼房
  19. Pandas数据排序
  20. STM32 TIMER REGISTER

热门文章

  1. GUI学习之二十九—QInputDialog学习总结
  2. ASP.NET Core 基础知识(一) ASP.NET Core是什么?与.NET Framework、Mono之间的关系 ?
  3. 前端之JavaScript:JS之DOM对象三
  4. 【python】对于程序员来说,2018刑侦科推理试卷是问题么?
  5. LeetCode--152--乘积最大子序列(python)
  6. A1002
  7. SQL的七种连接
  8. PG_CONFIG-NOTFOUND
  9. (10)python学习笔记一
  10. Day3 02判定两个对象的引用是否相同