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

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

      Singleton   
-instance:Singleton 

-Singleton()

+GetInstance()

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

  1. public class Singleton
  2. {
  3. private static Singleton Instance;
  4.  
  5. private Singleton() { }
  6.  
  7. public static Singleton GetInstance()
  8. {
  9. if (Instance == null)
  10. {
  11. Instance = new Singleton();
  12. }
  13. return Instance;
  14. }
  15. }

客户端调用

  1. Singleton singleton = Singleton.GetInstance();

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

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

  1. public class Singleton
  2. {
  3. private static Singleton Instance;
  4. private static readonly object syncRoot = new object();
  5.  
  6. private Singleton() { }
  7.  
  8. public static Singleton GetInstance()
  9. {
  10. if (Instance == null)----------先判定是否是否存在实例,如存在则直接返回,避免无用的加锁影响性能。
  11. {
  12. lock (syncRoot)
  13. {
  14. if (Instance == null)----------双重加锁
  15. {
  16. Instance = new Singleton();
  17. }
  18. }
  19. }
  20. return Instance;
  21. }
  22. }

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

  1. public sealed class Singleton----封闭类,不能被集成
  2. {
  3. private static readonly Singleton instance = new Singleton();-----readonly标示了该实例只能在初始化中分配。
  4.  
  5. private Singleton() { }
  6.  
  7. public static Singleton GetInstance()
  8. {
  9. return instance;
  10. }
  11. }

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

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

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

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

  1. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

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

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

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

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

  4. c#设计模式-单例模式(面试题)

    c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...

  5. 最简单的设计模式——单例模式的演进和推荐写法(Java 版)

    前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...

  6. ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值

    前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...

  7. Java设计模式の单例模式

    -------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...

  8. java设计模式——单例模式(一)

    一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...

  9. php实现设计模式————单例模式

    php实现设计模式————单例模式 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 如何阻止这种实例化实现理想的单例模式 代码实现 什么是单例模式 为什么要使用单例模式 ...

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

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

随机推荐

  1. NTC电阻Rt与温度T关系

    NTC电阻Rt与温度T公式如下: Rt=10000*exp(3950*(1/(273.15+T)-1/(273.15+25))). 例:0摄氏度时,电阻为33620.6037214357 欧姆 Rt= ...

  2. Provider增删改查

    package com.fei.provider; import org.apache.ibatis.jdbc.SQL; import com.fei.domain.User; public clas ...

  3. 过滤函数filter

    >>> def validate(usernames): if (len(usernames) > 4) and (len(usernames) < 12): retur ...

  4. ubuntu16.04 安装mysql

    安装mysql 1.sudo apt-get install mysql-server 2.sudo apt install mysql-client 3.sudo apt install libmy ...

  5. 【bzoj 4554】【Tjoi2016&Heoi2016】【NOIP2016模拟7.12】游戏

    题目 分析 当没有石头的时候,就用二分图匹配来做. 但现在加入了石头, 所以,求出每行和每列联通快的个数,如果有一块平地,包括在某个行联通块以及某个列联通块中,连边. //无聊打了网络流,匈牙利也可以 ...

  6. 【leetcode】698. Partition to K Equal Sum Subsets

    题目如下: 解题思路:本题是[leetcode]473. Matchsticks to Square的姊妹篇,唯一的区别是[leetcode]473. Matchsticks to Square指定了 ...

  7. Codeforces Round #596 Div1 A~E题解

    我好菜啊 A 题意: 定义p-二进制数为2^k-p,给出n和p,求用最小个数的p-二进制数来表示n 1<=n<=10^9,-1000<=p<=1000 题解: 猜结论,答案不会 ...

  8. 多重背包的二进制优化——DP

    #include<cstdio> #include<cstring> #include<algorithm> #define LL long long using ...

  9. JS onclick中this用法

    当在dom元素中使用onclick绑定事件的时候,可以使用this来指向该元素对象. 打印输出的内容为: 所以可以通过该this对象来获取子元素 //通过element获取该对象下的一个audio标签 ...

  10. django model 操作总结

    使用场景 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了).//两个表的数据一一对应 例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足 ...