1.什么事单例模式?

  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

  单例模式有以下特点:
    1、单例类只能有一个实例。
    2、单例类必须自己创建自己的唯一实例。
    3、单例类必须给所有其他对象提供这一实例。

  单例模式主要分为:饿汉模式,懒汉模式。

  饿汉式和懒汉式区别:

  从名字上来说,饿汉和懒汉,饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。

  单例模式着重涉及到了一个线程安全性的问题。

  什么是线程安全?

  如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

  或者说:一个类或者程序所提供的接口对于线程来说是原子操作,或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题,那就是线程安全的。

 2.单例模式应用场景

1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~

2. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。

3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。

4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

5. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。

6. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。

7. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。

8. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统

3.单例应用举例。

主要实现与解释都写在了代码之中。

  1. /**
  2. * @FileName Singleton.java
  3. * @Package com.ali.pattern.singleton
  4. * @Description
  5. * <p>这里稍微对这里涉及到的几个关键字做一下介绍:
  6. * 一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,
  7. * 因此不能将它cache在线程memory中。volatile是变量修饰符,
  8. * 而synchronized则作用于一段代码或方法。
  9. * volatile只是在线程内存和“主”内存间同步某个变量的值,
  10. * 而synchronized通过锁定和解锁某个监视器同步所有变量的值。
  11. * 显然synchronized要比volatile消耗更多资源。
  12. * 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
  13. final类不能被继承,没有子类,final类中的方法默认是final的。
  14. final方法不能被子类的方法覆盖,但可以被继承。
  15. final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
  16. final不能用于修饰构造方法。
  17. 注意:父类的private成员方法是不能被子类方法覆盖的,
  18. 因此private类型的方法默认是final类型的。
  19. static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,
  20. 也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
  21. 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,
  22. 它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,
  23. Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。
  24. 因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
  25. 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,
  26. 当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。 </p>
  27. * @Author ali blog:http://www.cnblogs.com/accipiter
  28. * @Date 2016年1月19日下午1:21:46
  29. * @Version V1.0.1
  30. */
  31. package com.ali.pattern.singleton;
  32.  
  33. /**
  34. * @ClassName Singleton
  35. * <p>但是以上懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的</p>
  36. * @Description TODO
  37. * @Date 下午1:21:46
  38. */
  39. public class Singleton {
  40. //饿汉
  41. private static Singleton sigleton1 = new Singleton();
  42. /**
  43. * @Title getInstanceE
  44. * @Description 饿汉模式,本身就是线程安全的。
  45. * @return
  46. * @Return Singleton
  47. * @Throws
  48. * @user Administrator
  49. * @Date 2016年1月19日
  50. */
  51. public static Singleton getInstanceE(){
  52. return sigleton1;
  53. }
  54. //懒汉
  55. private static Singleton singleton=null;
  56. private Singleton() {
  57. }
  58. /**
  59. * @Title getInstance
  60. * @Description 线程不安全
  61. * @return
  62. * @Return Singleton
  63. * @Throws
  64. * @user Administrator
  65. * @Date 2016年1月19日
  66. */
  67. public static Singleton getInstance(){
  68. if(null==singleton){
  69. singleton=new Singleton();
  70. }
  71. return singleton;
  72. }
  73. /**
  74. * @Title getInstanceSafe
  75. * @Description 线程安全,每次都要同步,会影响性能,毕竟99%的情况下是不需要同步的,
  76. * @return
  77. * @Return Singleton
  78. * @Throws
  79. * @user Administrator
  80. * @Date 2016年1月19日
  81. */
  82. public static synchronized Singleton getInstanceSafe(){
  83. if(null==singleton){
  84. singleton=new Singleton();
  85. }
  86. return singleton;
  87. }
  88. /**
  89. * @Title getInstanceSafeD
  90. * @Description 双重锁定
  91. * 确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,
  92. * 同时避免了每次都同步的性能损耗
  93. *
  94. * @return
  95. * @Return Singleton
  96. * @Throws
  97. * @user Administrator
  98. * @Date 2016年1月19日
  99. */
  100. public static Singleton getInstanceSafeD(){
  101. if(null==singleton){
  102. synchronized (Singleton.class) {
  103. if(null==singleton){
  104. singleton=new Singleton();
  105. }
  106. }
  107. }
  108. return singleton;
  109. }
  110. /**
  111. * @ClassName LazyHolder
  112. * @Description 静态内部类,既实现了线程安全,又避免了同步带来的性能影响
  113. * @Date 下午1:44:53
  114. */
  115. private static class LazyHolder{
  116. private static final Singleton singleton=new Singleton();
  117. }
  118. public static final Singleton getInstanceClass(){
  119. return LazyHolder.singleton;
  120. }
  121.  
  122. public void operate(int i){
  123. System.out.println(i+"、操作!");
  124. }
  125. /**
  126. * @Title main
  127. * @Description TODO
  128. * @param args
  129. * @Return void
  130. * @Throws
  131. * @user Administrator
  132. * @Date 2016年1月19日
  133. */
  134. public static void main(String[] args) {
  135. Singleton.getInstance().operate(1);
  136. Singleton.getInstanceSafe().operate(2);
  137. Singleton.getInstanceSafeD().operate(3);
  138. Singleton.getInstanceClass().operate(4);
  139. Singleton.getInstanceE().operate(5);
  140. }
  141.  
  142. }
  1.  

设计模式之单例模式Singleton(三创建型)的更多相关文章

  1. C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)

    一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...

  2. 设计模式(二)单例模式Singleton(创建型)

    几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销.再如大家最经常用的IM, ...

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

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

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

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

  5. 单例模式/singleton模式/创建型模式

    Java实现要点: 私有构造方法 线程安全(并发的考虑) 延迟加载(效率的考虑,对于较大的类在使用时在加载) 公有方法访问单一实例 常见单例模式代码及问题 //无延迟加载,常驻内存(即使不使用) cl ...

  6. 设计模式一: 单例模式(Singleton)

    简介 单例模式是属于创建型模式的一种(另外两种分别是结构型模式,行为型模式).是设计模式中最为简单的一种. 英文单词Singleton的数学含义是"有且仅有一个元素的集合". 从实 ...

  7. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  8. php设计模式(一):简介及创建型模式

    我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式. 一.设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用.容易被他人理解的.可靠的代码设计经验的总结. ...

  9. 【设计模式】单例模式-Singleton

    [设计模式]单例模式-SingletonEnsure a class has only one instance, and provide a global point to access of it ...

  10. 设计模式(4) -- 单例模式(Singleton)

    设计模式(4)  -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...

随机推荐

  1. JavaScript------获取url地址中的参数

    $(document).ready(function () { //获取地址中的参数(name是字符串) function getParameter(name) { //正则表达式 var reg = ...

  2. Python Day20

    Django 表操作 1.基本操作 # 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # o ...

  3. Arcgis, ArcEngine, Arcgis Server使用开发汇总 索引

    ArcGIS系列软件license及安装: Arcgis SDE10.1 和 Arcgis server10.1的授权文件license tnt_esri.dat Arcgis8.1安装license ...

  4. Spring--多人开发

    在spring中, 可以定义多个配置文件. 例子: ①首先定义一个班级类和一个学生类 1 package com.fuwh.spring;      }                    }    ...

  5. java 多线程 4 线程池

    系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...

  6. java时间类型操作

    java中Date类型与字符串相互转化 Date date = new Date();        System.out.println(date);        //DateFormat类为一个 ...

  7. jcFeather For Maya 2012免费版

    jcFeather羽毛插件有Maya2012免费试用版. 免费版有正版的所有功能,可制作羽毛,可渲染,但是一个Maya场景文件只能有3个jcFeather 节点和3个jcPreFeather节点. j ...

  8. VSTO开发之一

    VSTO是微软推出一种对Office产品进行操作的技术,其中提供了一些类库来让开发人员可以更方便地开发出Office的解决方案,即对Word/Excel/Outlook实现一些扩展功能. 新建-> ...

  9. [Python] from scipy import sparse 报 DLL load failed:找不到指定模块错误

    依赖vc运行环境.需要安装 vc_redist Py3.5要安装2015版 传送门: https://www.microsoft.com/zh-CN/download/details.aspx?id= ...

  10. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...