在Java开发过程中,很多场景下都会碰到或要用到单例模式,在设计模式里也是经常作为指导学习的热门模式之一,相信每位开发童鞋都用到过。我们总是沿着前辈的足迹去做设定好的思路,往往没去探究为何这么做,所以这篇文章对单例模式做了详解。

一、单例模式定义:

  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

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

单例模式保证了全局对象的唯一性,比如系统启动读取配置文件就需要单例保证配置的一致性。

三、线程安全的问题

  一方面在获取单例的时候,要保证不能产生多个实例对象,后面会详细讲到五种实现方式;

  另一方面,在使用单例对象的时候,要注意单例对象内的实例变量是会被多线程共享的,推荐使用无状态的对象,不会因为多个线程的交替调度而破坏自身状态导致线程安全问题,比如我们常用的VO,DTO等(局部变量是在用户栈中的,而且用户栈本身就是线程私有的内存区域,所以不存在线程安全问题)。

四、单例模式的选择

  还记得我们最早使用的MVC框架Struts1中的action就是单例模式的,而到了Struts2就使用了多例。在Struts1里,当有多个请求访问,每个都会分配一个新线程,在这些线程,操作的都是同一个action对象,每个用户的数据都是不同的,而action却只有一个。到了Struts2, action对象为每一个请求产生一个实例,并不会带来线程安全问题(实际上servlet容器给每个请求产生许多可丢弃的对象,但是并没有影响到性能和垃圾回收问题,有时间会做下研究)。

五、实现单例模式的方法

1.饿汉式单例(立即加载方式)

/*** 饿汉式单例:饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用* @author coco.xu* @date 2019-03-21*/
public class Singleton_1 {//在单例类被加载时候,就实例化一个对象交给自己的引用private static Singleton_1 singleton = new Singleton_1();//私有构造方法private Singleton_1(){}//静态工厂方法public static Singleton_1 getInstance(){return singleton;}
}

  饿汉式单例在类加载初始化时就创建好一个静态的对象供外部使用,除非系统重启,这个对象不会改变,所以本身就是线程安全的。
  Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且闭着眼就认为反射机制不存在。)

2.懒汉式单例

/*** 懒汉式模式:懒汉式在调用取得实例方法的时候才会实例化对象* @author keke.xu* @date 2019-03-21*/
public class Singleton_2 {private static Singleton_2 singleton;//私有构造private Singleton_2(){}public static synchronized Singleton_2 getInstance(){if(singleton==null){singleton = new Singleton_2();}return singleton;}
}

转载于:https://www.cnblogs.com/cocoxu1992/p/10573593.html

设计模式学习(三)——单例模式相关推荐

  1. js设计模式学习之单例模式

    单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点 实现一个单例模式 用一个变量标志当前是否已经为某个类型创建过对象,如果是,则下次直接返回之前创建的对象. var Singleton = ...

  2. C#设计模式学习笔记-单例模式

    最近在学设计模式,学到创建型模式的时候,碰到单例模式(或叫单件模式),现在整理一下笔记. 在<Design Patterns:Elements of Resuable Object-Orient ...

  3. 设计模式学习之单例模式

    单例模式 (读了一篇博文,记一下笔记啦,学习学习嘛..) 目的:为保证程序的生命周期内一个类的实例只有一个(为什么这样做,当遇到具体问题自会清楚,这里不再赘述). 直接上代码: public clas ...

  4. Java设计模式学习记录-单例模式

    前言 已经介绍和学习了两个创建型模式了,今天来学习一下另一个非常常见的创建型模式,单例模式. 单例模式也被称为单件模式(或单体模式),主要作用是控制某个类型的实例数量是一个,而且只有一个. 单例模式 ...

  5. 设计模式学习(一) 单例模式

    引入 何为单间模式?简单的描述,用来创建独一无二的,只能有一个实例的对象的入场券. 定义:确保一个类只有一个实例,并提供一个全局访问点 揭破经典的单例模式实现 package com.zpkj.pro ...

  6. 设计模式学习 之 单例模式

    单例模式: 定义 一个类有且仅有一个实例,并且自行实例化向整个系统提供. <来自百科> 这些 概念和要点 是 了解 单例模式的 一些基本概念 C# 单例实现要点 Singleton模式是限 ...

  7. Header First设计模式学习笔记——单例模式

    2019独角兽企业重金招聘Python工程师标准>>> 问题引入         有时候对于有些对象,我们只需要一个,多了反而会出现很多问题.比如:线程池,缓存,处理器偏好设置,日志 ...

  8. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  9. 老王讲设计模式(三)——单例模式

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 早晨,老王来到公司,发现小蔡正对着电脑屏幕发呆,于是走到小蔡身后,发现小 ...

  10. 设计模式学习(三):Adapter适配器模式

    一.什么是Adapter模式 我们先举个例子:如果想让额定工作电压是直流12V的笔记本电脑在交流220V的电源下工作,应该怎么做呢?通常,我们会使用适配器,将家庭用的交流220V电压转换成我们所需要的 ...

最新文章

  1. 内存泄露的原因找到了,罪魁祸首居然是 Java TheadLocal
  2. uwsgi的log日志中出现错误uWSGI listen queue of socket 4 full。
  3. 浅谈auto与decltype函数的区别
  4. 视频质量检测中的TP、FP、Reacll、Precision
  5. python 自动化测试数据并发送到http-nodejs server
  6. r语言TeachingDemos包绘制黑白脸谱图
  7. 使用 Spring 2.5 基于注解驱动的 Spring MVC
  8. 网络安全课第二节 XSS漏洞检测防御
  9. 【免费】搜狗站长URL自动推送工具1.4.1
  10. 纯css实现动态渐变背景,一分钟学会
  11. win10的系统mysql服务器地址,win10注册mysql服务器地址
  12. 设计一个长方形类 java_用java设计一个长方形类,成员变量包括长和宽.方法:计算面积和周长,有相应的set和get方法...
  13. 单核cpu多线程有必要吗?
  14. 论文阅读-MLPD:Multi-Label Pedestrian Detector in Multispectral Domain(海康威视研究院实习项目)
  15. 计算机的人分类,计算机的分类
  16. isin函数及其反函数
  17. python图片马赛克_python检测图片是否有马赛克内容
  18. ES6——数组数据去重
  19. 推荐一个好用的PDF阅读器
  20. 集合的基本操作和基本运算

热门文章

  1. 用GDB Server进行远程调试
  2. android根据拍摄url获取格式,Android如何通过URI获取文件路径示例代码
  3. java服务器端测试_java-在服务器端测试Spring Web Services端点?
  4. 可以使用中文作为变量名_次氯酸可以作为伤口消毒使用吗?
  5. 小数前的0在html不显示,jsp小数显示问题 例如 我在oracle 数据库中查询出来的是 0.01 但是在jsp页面上就显示成 .01 没有前面的0...
  6. java gc full gc_Java中full gc什么意思?
  7. ajax用post方法,jquery中get,post和ajax方法的使用小结
  8. java pkcs1转pkcs8_pkcs1与pkcs8格式RSA私钥互相转换
  9. mkdir -p命令
  10. 10位IT领袖给应届毕业生的10条忠告