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)—单例模式
前言 这一章的课题看起来就很和蔼可亲了,比起前面绕的我不要不要的工厂模式,那感觉真是太好了,但是正是因为简单,那么问题就来了,我怎么才能把这个东西叙述清楚?怎么样才能老少咸宜呢? 如何能够在把这个东西 ...
随机推荐
- 2017-06-22初识python
初识python #!/usr/bin/env python (python解释器的文件路径)# -*- coding:utf-8 -*- (使用的编码内型)# python 2.7 <需要加第 ...
- 出错场景是升级oracle驱动,将版本从ojdbc14升级到ojdbc6,hibernate执行原生态sql语句会报如下错误
出错场景是升级oracle驱动,将版本从ojdbc14升级到ojdbc6,hibernate执行原生态sql语句会报如下错误:org.hibernate.MappingException: No Di ...
- Linux下memcached安装与连接
前几天技术总监要我在项目中加一个memcached,以前也从来没有配置过,所以就去网上找教程,最终折腾成功.比较坑的就是sasl协议那里. 由于memcached依赖libevents,所以要下载两个 ...
- 持续集成篇-- SonarQube代码质量管理平台的配置与使用
样例视频教程:http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53 一.SonarQube的配置(前提,先用admin用 ...
- mac下git配置和jenkins打包
今天自己配置了下jenkins,还算是比较顺利,把整个过程和大家分享下. 1. 查看秘钥是否存在 打开终端查看是否已经存在SSH密钥:cd ~/.ssh 如果没有密钥则不会有此文件夹,有则备份删除, ...
- mvcSSHweb.xml要配置的信息
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" ...
- 第二章:1.0 Django 入门和开发环境
1. 选择 Django Web框架来做Web接口开发,主要原因是由于学习资料丰富,便于学习. 2. Django 对 python 版本的支持情况. Django 的版本在 1.8 ,1.9 , 1 ...
- Vue.js学习笔记(二) - 常用模板语法
本篇将在上一篇的基础上记录文本渲染.表达式.过滤器以及常用指令的简单用法. 一.文本渲染 Vue支持动态渲染文本,即在修改属性的同时,实时渲染文本内容.同时为了提高渲染效率,也支持只渲染一次,即第一次 ...
- SSH中的Invalid action class configuration that references an unknown class named.......
最近用SSH框架做项目的时候页面提交数据到后台,遇到了这个问题,百度了一下,网上的解决办法无非两种: 1.检查struts.xml ,applicationContext.xml的配置是否正确 2. ...
- 使用jenkins实现持续集成
一.jenkins 介绍 它是一个自动化的周期性的集成测试过程,从检出代码.编译构建.运行测试.结果记录.测试统计等都是自动完成的,无需人工干预: 它需要有专门的集成服务器来执行集成构建: 它需要有代 ...