Head First 设计模式 第5章 单例模式
第5章 单例模式
1、定义:确保一个类只有一个实例,并为其创建访问点。
2、单例模式的类图:
对应的单例模式的代码:
package com.ek.singleton;
/**
* @包名 com.ek.singleton
* @文件名 Singleton.java
* @作者 edi_kai
* @创建日期 2015年8月25日
* @版本 V 1.0
* @描述
*/
public class Singleton { public static Singleton uniqueSingleton; private Singleton() {
} public static Singleton getInstance() {
if (null == uniqueSingleton) { //确保返回的是同一个对象
uniqueSingleton = new Singleton();
}
return uniqueSingleton;
}
}
这样的单例模式真的没问题吗?当然有。当有两个线程同时调用getInstance方法时,就有可能返回两个Singleton对象。
那么,我们该如何解决这个问题呢?将方法getInstance设置成线程同步的,如下:
package com.ek.singleton;
/**
* @包名 com.ek.singleton
* @文件名 Singleton.java
* @作者 edi_kai
* @创建日期 2015年8月25日
* @版本 V 1.0
* @描述
*/
public class Singleton { public static Singleton uniqueSingleton; private Singleton() {
} public static synchronized Singleton getInstance() {
if (null == uniqueSingleton) {
uniqueSingleton = new Singleton();
}
return uniqueSingleton;
}
}
这是我们设置成线程同步之后的代码,这样可以避免上面说的问题,但是又引入了新的问题:同步一个方法会使效率降低100倍,如果getInstance方法使用比较频繁,我们得需要考虑其他方法来解决问题。
看下面的代码:
package com.ek.singleton;
/**
* @包名 com.ek.singleton
* @文件名 Singleton.java
* @作者 edi_kai
* @创建日期 2015年8月25日
* @版本 V 1.0
* @描述
*/
public class Singleton { public static Singleton uniqueSingleton = new Singleton(); private Singleton() {
} public static Singleton getInstance() {
return uniqueSingleton;
}
}
这里我们直接在静态初始化器中实例化对象,这样JVM在加载这个类的时候,会马上创建这个对象,保证了唯一性。存在的问题是:只要JVM加载该类,对象就会被实例化,不管现在我们是不是需要这个实例化对象。
那么让我们来看最后一种方法,如下:
package com.ek.singleton;
/**
* @包名 com.ek.singleton
* @文件名 Singleton.java
* @作者 edi_kai
* @创建日期 2015年8月25日
* @版本 V 1.0
* @描述
*/
public class Singleton { public volatile static Singleton uniqueSingleton; private Singleton() {
} public static Singleton getInstance() {
if (null == uniqueSingleton) {
synchronized (Singleton.class) {//只有在第一次实例化对象的时候会同步,即便调用比较频繁,也不会影响性能
if (null == uniqueSingleton) {
uniqueSingleton = new Singleton();
}
}
}
return uniqueSingleton;
}
}
这种方式其实就是最理想的方式,其中volatile关键字确保当uniqueSingleton变量被初始化成Singleton实例时,多个线程可以正确的处理uniqueSingleton变量。该方式也有一个问题,那就是volatile关键字需要JDK 1.4以上才支持,在1.4及以下版本中被忽略了,(/ □ \)。
好了,到这里单例模式我们就介绍完了,一定要根据自己的实际环境来确定使用哪一种方式的来实现单例模式哦....
谢谢阅读
转载请注明出处,谢谢!
Head First 设计模式 第5章 单例模式的更多相关文章
- JAVA设计模式——第 3 章 单例模式【Singleton Pattern】(转)
这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一.独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的 ...
- 设计模式之第0章-单例模式(Java实现)
设计模式之第0章-单例模式(Java实现) 当当当当~首先有请最简单的单例模式登场,先来个自我介绍吧 单例模式之自我介绍 我,单例模式(Singleton Pattern)是一个比较简单的模式,我的定 ...
- 第1章 单例模式(Single Pattern)
原文 第1章 单例模式(Single Pattern) 单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 一.常用模式: 1 ...
- Java多线程编程核心技术-第6章-单例模式与多线程-读书笔记
第 6 章 单例模式与多线程 本章主要内容 如何使单例模式遇到多线程是安全的.正确的. 6.1 立即加载 / “饿汉模式” 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就 ...
- Java并发程序设计(八)设计模式与并发之单例模式
设计模式与并发之单例模式 简单的单例实现: public class Singleton { private Singleton(){ System.out.println("Creatin ...
- 设计模式之序章-UML类图那点事儿
设计模式之序-UML类图那点事儿 序 打14年年底就像写那么一个系列,用于讲设计模式的,代码基于JAVA语言,最早接触设计模式是大一还是大二来着,那时候网上有人给推荐书,其中就有设计模式,当时给我推荐 ...
- 设计模式(一)单例模式:创建模式 ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
设计模式(一)单例模式:创建模式 先聊一下关于设计的几个原则(1)单一原则(SRP):一个类应该仅有一个引起它变化的原因 :意思就是 (一个类,最好只负责一件事情,并且只有一个引起它变化的原因(2)开 ...
- [Python设计模式] 第21章 计划生育——单例模式
github地址:https://github.com/cheesezh/python_design_patterns 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式 ...
- headfirst设计模式(6)—单例模式
前言 这一章的课题看起来就很和蔼可亲了,比起前面绕的我不要不要的工厂模式,那感觉真是太好了,但是正是因为简单,那么问题就来了,我怎么才能把这个东西叙述清楚?怎么样才能老少咸宜呢? 如何能够在把这个东西 ...
随机推荐
- 无法为具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6”
"System.InvalidOperationException"类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 无法为具有固定名称"MySql. ...
- 从app上传图片到php,再上传到java后端服务器的方法一览
在现在的网络开发中,上传图片类的需求实在是太普通不过了,但是对于怎么样做到上传图片,对于刚开始建立项目的时候,还是有点不知所措的.也许有幸,我们做的项目是之前已经有人写过类似的用例了,那么我们只需要依 ...
- ECMAScript 6 中的快捷语法汇总及代码示例
对于每个 JavaScript 开发人员,快捷语法都是必备技能之一,下面就集中介绍这些快捷语法. 三元运算符 传统写法 const x = 20; let answer; if (x > 10) ...
- Chapter 1. Introduce
前言 本书全名是<H.264 and MPEG-4 Video Compression, Video Coding For Next-generation Multimedia>,作者为 ...
- 关于Net开发中一些SQLServer性能优化的建议
一. ExecuteNonQuery和ExecuteScalar 对数据的更新不需要返回结果集,建议使用ExecuteNonQuery.由于不返回结果集可省掉网络数据传输.它仅仅返回受影响的行数.如果 ...
- SSH框架 spring 配置中的: scope="prototype"
"可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理, 避免struts中Action的线程安全问题." 这句话怎么 ...
- 猜年龄---while循环
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author:Andy Chen age_of_oldboy = 56 count = 0while True ...
- visual studio错误中断处理
点击将错误黏贴到剪贴板,复制到文本文件中.具体错误原因即可查出.
- Java试题
1.不使用循环,等比数列输出整型 n.2n.4n.8n--当大于max时,反向输出8n.4n.2n.n. 例如 n=10,max=100. 输出: 10 20 40 80 80 40 20 10 解题 ...
- Nginx 反向代理、负载均衡
## Nginx 反向代理. (一)简介 一.什么是代理服务器 客户机原本发送给服务器的请求,不会直接发送给服务器,而是先发送给代理服务器:经过代理服务器处理后转发给服务器:服务器数据处理后转回给代理 ...