设计模式学习(三)——单例模式

  在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java网络03流

网络程序所做的很大一部分工作只是输入和输出:从一个系统向另一个系统移动数据。 输出流 Java的基本输出流类是java.io.OutputStream: public abstract class OutputStream 这个类提供了写入数据所需的基本方法,包括: public abstract vo…

基于微信小程序开发的仿微信demo

(本文参考自github/liujians,地址:https://github.com/liujians/weApp) 作者声明: 基于微信小程序开发的仿微信demo 整合了ionic的样式库和weui的样式库 使用请查看使用必读! 更新日志请点击这里 目前功能 查看消息 网络请求获取数据(download示例server…

设计模式之六大原则

设计模式之设计原则 这软件设计过程中,有六大设计原则: 单一职责原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则开闭原则由于软件开发过程中,根据业务不同等因素形成了各种复杂的而不可预料的需求,遵守原则,让项…

安装配置tengine

安装tengine 1、依赖gcc openssl-devel pcre-devel zlib-devel 安装:yum install gcc openssl-devel pcre-devel zlib-devel 2、解压tengine压缩包,并进入目录; 3、./configure --prefix/usr/tengine 4、make && make install 5…

使用springboot集成jseesite

请访问 开源中国下的https://git.oschina.net/wolfking/wolfking-jeesitehttps://www.oschina.net/p/wolfking-jeesite?fromerr6Iie3qZt 下载源码,按照如下的运行使用 springboot 改造 jeesite,只保留最简单的系统配置 。 介绍 1、运行主类,…

解决idea 中web项目无法正常显示的问题

转载于:https://www.cnblogs.com/nulijiushimeili/p/10575364.html

Hadoop小知识点

hdfs命令行 上传 hadoop fs -put 文件名 hdfs://主机名:9000/... 下载 hadoop fs -get hdfs://主机名:9000/... 文件名 /hadoop/share/hadoop/mapreduce 文件夹下有测试程序 提交MapReduce任务命令 #hadoop jar hadoop-mapreduce-examples-2.4.1.jar pi 5 5 hadoop fs -m…

copy 扩展名 包含子文件夹 文件 到某个 文件夹

比如我在d:\fff下面有很多子文件夹,子文件夹里还有子文件夹,里面有些文件夹里有.ppm.bz2的后缀的文件,需要把他们找出来复制到d:\fff2里面,应该怎么用批处理写?最佳答案1234echo offfor /r d:\fff %%a in (*.ppm.bz2) …

在线视频常见加密方式及安全性透析

信息化时代,多媒体的应用日渐成为人们生活中不可或缺的部分,无论是获取最新资讯还是教育学习,视频都是直观高效的媒介之一。 基于互联网的快速传播,众多培训机构也逐渐将线下原创版权课程迁移到在线平台中,一方面可以更…

分享一个前后端分离的web项目(vue+spring boot)

Github地址:https://github.com/smallsnail-wh 前端项目名为wh-web后端项目名为wh-server项目展示地址为我的github pages(https://smallsnail-wh.github.io)用户名:admin,密码admin(第一次启动会比较慢&am…

部署php项目到linux

服务器:39.106.26.67rootBayou2009 数据库:rootbayou2009 项目文件夹路径:/home/www/项目文件夹名称:education.bayou-tech.cn 绑定域名:education.bayou-tech.cn 绑定域名: 用ftp把配置文件下班到windows修…

ionic最新安装教程

公司最近开发webapp,研究了一下ionicangularjs开发。 安装过程中碰到许多问题,发现网上有好多资料都已经过时,在这里把最新的流程记录一下。 首先是安装node.js,通过nodejs官网下载,没什么问题。npm已经默认安装&#…

ZooKeeper安装配置

配置 1、在conf目录下创建一个配置文件zoo.cfg tickTime2000 dataDir.../zookeeper/data dataLogDir.../zookeeper/dataLog clientPort2181 initLimit5 syncLimit2 server.1server1:2888:3888 server.2server2:2888:3888 server.3server3:2888:3888 •tickTime&#…

1.1 算法编译与调试

编程要保持简单(KISS, keep it simple and stupid)。 算法竞赛中的输入输出框架: 输入数据保存在文件中,输出数据也保存在文件中。 几乎所有算法竞赛的输入数据和标准答案都是保存在文件中的。 使用文件最简单的方法是使用输入…

ionic2开发的仿外卖点餐系统(Ionic2+Angular2

github上的项目源码 Run this Project(运行该项目) first(首先): make sure your computer install ionic 确保你的电脑安装了ionic2,不懂自行百度 second(其次):$ ionic start wechat_restaurant tutorial…

Container Injection

Container的历史: 2000 年的时候 FreeBSD 开发了一个类似于 chroot 的容器技术 Jails,这是最早期,也是功能最多的容器技术。Jails 英译过来是监狱的意思,这个“监狱”(用沙盒更为准确)包含了文件系统、用户…

HadoopHA集群搭建

三台主机: 192.168.143.111 hdp1 192.168.143.112 hdp2 192.168.143.113 hdp3 1、安装配置ZooKeeper; (1)在conf目录下创建配置文件zoo.cfg tickTime2000 dataDir.../zookeeper/data dataLogDir.../zookeeper/dataLog clientPort2181 initLim…

node搭建服务器,写接口,调接口,跨域

刚开始学node,今天做这个也是累死宝宝了,以后可以自己写接口自己用了,再也不用麻烦人家后台人员了,这些年我们欠他们的太多了,说多了都是泪,不多说,往下看吧。。。 服务端项目目录下&#xff1a…

ThreadPoolExcutor 线程池 异常处理 (上篇)

前言 最近看到crossoverJie的一篇文章:一个线程罢工的诡异事件 首先感谢原作者的分享,自己获益匪浅。然后是回想到自己的一次面试经历,面试官提问了线程池中的线程出现了异常该怎样捕获?会导致什么样的问题? 示例代码 …

3 MapReduce计算模型

MapReduce被广泛应用于日志分析、海量数据排序、在海量数据中查找特定模式等场景中。 MapReduceJob 在Hadoop中,每个MapReduce任务都被初始化为一个Job。 每个Job又可以分为两个阶段:Map阶段和Reduce阶段。这两个阶段分别用Map函数和Reduce函数来表示。…