设计模式:单例模式的写法(基础写法和线程安全写法)

单例模式的写法非常多。先给出一种最基础的写法:

(A种写法):

package singleton;

public class SingletonInstance {

	private static SingletonInstance mSingletonInstance = null;

	// 特意将构造函数设置成 private,防止外部使用者new SingletonInstance()。
	private SingletonInstance() {

	}

	public static SingletonInstance getInstance() {
		if (mSingletonInstance == null) {
			mSingletonInstance = new SingletonInstance();
		}

		return mSingletonInstance;
	}
}

A写法是单例模式最简单、最基础、最清晰的写法。但遗憾的是这样的写法是线程不安全的代码写法。

假设该类同一时候在并发N多个线程中被訪问被使用、尤其是假设这个类假设涉及到数据库訪问等等此类线程安全问题敏感的代码应用场景时,后果将是一场灾难。

但单例模式的A种写法也有其广泛场景:不要求线程安全,没有同步需求且效率优先级高的场景中。推荐使用单例模式的A种写法。

B种写法(线程安全写法1):

package singleton;

public class SingletonInstance {

	private static SingletonInstance mSingletonInstance = null;

	// 特意将构造函数设置成 private。防止外部使用者new SingletonInstance()。

private SingletonInstance() {

	}

	public static synchronized SingletonInstance getInstance() {
		if (mSingletonInstance == null) {
			mSingletonInstance = new SingletonInstance();
		}

		return mSingletonInstance;
	}
}

单例模式的B种写法事实上是在A种写法的基础上的改进。要点是添加了同步机制:synchronized。

synchronized ,同步从某种意义上讲事实上就是堵塞,堵塞的结果就是随意时刻,仅仅有一个线程能够訪问该段同步方法体中的代码。这样被synchronized的代码性能将下降,但达到了线程安全的目的。

B种单例模式的写法。主要是为了解决线程安全。

变体非常多。变体的目的主要集中在怎样增强线程安全的操作性。现举比例如以下,比方:

B种写法的增强型变体(线程安全写法2):

package singleton;

public class SingletonInstance {

	// 注意!

volatile 也不能全然保证线程安全,后面将写关于volatile的文章解释这一点儿。
	// volatile仅仅是增强。

private static volatile SingletonInstance mSingletonInstance = null;

	// 特意将构造函数设置成 private。防止外部使用者new SingletonInstance()。
	private SingletonInstance() {

	}

	public static SingletonInstance getInstance() {
		if (mSingletonInstance == null) {

			// synchronized (SingletonInstance.class)不必锁住整个方法,仅仅锁住一块代码就可以。
			// 和synchronized (this)一样,但由于是static方法。故无法使用this。才使用XXXClass.class
			// synchronized的基本使用原则:尽可能不要锁住大块大块代码(方法体或类),仅仅锁住必需的一小块核心、急需同步的代码段就可以,越少越好,越小越好。
			// 要知道,一旦使用synchronized,就意味着代码性能的开销
			synchronized (SingletonInstance.class) {
				if (mSingletonInstance == null)
					mSingletonInstance = new SingletonInstance();
			}
		}

		return mSingletonInstance;
	}
}



时间: 2024-10-24 07:15:10

设计模式:单例模式的写法(基础写法和线程安全写法)的相关文章

最简单的设计模式——单例模式的演进和推荐写法(Java 版)

前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: 有这样一个类,该类在生命周期内有且只能有一个实例,该类必须自己创建自己的这个唯一实例,该类必须给所有其他对象提供这一实例(提供全局访问点),这样的类就叫单例类. 简单的说就是满足三个条件: 1.生命周期内有且只能有一个实例 2.自己提供这个独一无二的实例 3.该实例必须是能全局访问的 需要的考虑的

JAVA设计模式-单例模式(Singleton)线程安全与效率

一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式进行探索的. 本文的目的是:结合文章中的八种单例模式的写法,使用实际的示例,来演示线程安全和效率 既然是实际的示例,那么就首先定义一个业务场景:购票.大家都知道在春运的时候,抢票是非常激烈的.有可能同一张票就同时又成百上千的人同时在抢.这就对代码逻辑的要求很高了,即不能把同一张票多次出售,也不能出现

cocos-html5 JS 写法基础 语言核心

转载:http://blog.csdn.net/leasystu/article/details/18735797 cocos2dx 3.0 js继承:John Resiq的继承写法解析 CCClass.js cocos2d-html5/cocos2d/core/platform/CCClass.js ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题

设计模式--单例模式(Java)--考虑多线程环境下的线程安全问题 一:单例模式概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例 二:单例模式的实现方式 特别注意,在多线程环境下,需要对获取对象实例的方法加对象锁(synchronized) 方式一:(懒汉式)程序执行过程中需要这个类的对象,再实例化这个类的对象 步骤: 1.定义静态私有对象 2.构造方法私有化保证在类的外部无法实例化该类的对象 3.定义对外开放的静

[设计模式整理笔记 一] 基础知识

[设计模式整理笔记 一] 基础知识 [导读] [设计模式整理笔记 一] 基础知识 [设计模式整理笔记 二] 简单工厂模式(Simple Factory) [设计模式整理笔记 三] 工厂模式(Factory) [设计模式整理笔记 四] 抽象工厂模式(Abstract Factory) [设计模式整理笔记 五] 创建者模式(Builder) [设计模式整理笔记 六] 工厂模式与创建者模式总结 [设计模式整理笔记 七] 原型模式(ProtoType) [设计模式整理笔记 八] 单例模式(Singlet

c#设计模式-单例模式(面试题)

c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleton _instance = null; private Singleton(){} public static Singleton CreateInstance() { if(_instance == null) { _instance = new Singleton(); } return _in

c#设计模式-单例模式【转】

单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题 public class Singleton { private static Singleton _instance = null; private Singleton(){} public static Singleton CreateInstance() { if(_instance == null) { _instance = new Singleton(); } return _instance; } } 第

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

java设计模式 - 单例模式(干货)

深度讲解23种设计模式,力争每种设计模式都刨析到底.废话不多说,开始第一种设计模式 - 单例. 作者已知的单例模式有8种写法,而每一种写法,都有自身的优缺点. 1,使用频率最高的写法,废话不多说,直接上代码 /** * @author xujp * 饿汉式 静态变量 单例 */ public class Singleton implements Serializable { private static final long serialVersionUID = 1L; private fina