`

[转]各种创建单例模式的优缺点

阅读更多

单例模式应用于一个类只有一个实例的情况,并且为其实例提供一个全局的访问点。

特点

1.一个类只有一个实例

2.自己创建这个实例

3.整个系统只能用这个实例

应用场景

外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机。

内部资源:大多数软件都有一个(或多个)属性文件存放系统配置,这样的系统应该有一个对象管理这些属性文件。

实现方式

1.饿汉式:单例实例在类装载时就构建,急切初始化。(预先加载法)

/**
 * 饿汉式(推荐)
 *
 */
public class Singleton1 {

	private Singleton1() {
	}

	public static Singleton1 instance = new Singleton1();

	public Singleton1 getInstance() {
		return instance;
	}

}

 

优点 1.线程安全 
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快
缺点 资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化

 

2.懒汉式:单例实例在第一次被使用时构建,延迟初始化。

class Singleton2 {
	private Singleton2() {
	}

	public static Singleton2 instance = null;

	public static Singleton2 getInstance() {
		if (instance == null) {
              //多个线程判断instance都为null时,在执行new操作时多线程会出现重复情况
			instance = new Singleton2();
		}
		return instance;
	}
}

 

懒汉式在单个线程中没有问题,但在多线程就可能会出现两个或多个Singleton2实例情况,

虽然后面实例化的Singleton2会覆盖前面实例化的Singleton2,但最好避免这样的情况。

改进方式就是加锁synchornized

class Singleton3 {
	private Singleton3() {
	}

	public static Singleton3 instance = null;

	public static synchronized Singleton3 getInstance() {
		if (instance == null) {
			instance = new Singleton3();
		}
		return instance;
	}
}
优点 资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法
缺点 第一次加载时不够快,多线程使用不必要的同步开销大


3.双重检测

class Singleton4 {
	private Singleton4() {
	}

	public static Singleton4 instance = null;

	public static Singleton4 getInstance() {
		if (instance == null) {
			synchronized (Singleton4.class) {
				if (instance == null) {
					instance = new Singleton4();
				}
			}
		}
		return instance;
	}
}

 

优点 资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法
缺点 第一次加载时反应不快,由于java内存模型一些原因偶尔失败

 

4.静态内部类

class Singleton5 {
	private Singleton5() {
	}

	private static class SingletonHelp {
		static Singleton5 instance = new Singleton5();
	}

	public static Singleton5 getInstance() {
		return SingletonHelp.instance;
	}
}

 

优点 资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法
缺点 第一次加载时反应不够快

 

总结:一般采用饿汉式(1),若对资源十分在意可以采用静态内部类(4),不建议采用懒汉式及双重检测(2、3)

另外

对于第二种可以采用volatile方式

volatile用更低的代价代替同步

解释:同步的代价主要有覆盖范围决定,如果可以降低同步的覆盖范围,可大幅提升性能。

而volatile覆盖范围是变量级别的,因此同步代价很低。

volatile原理:告诉处理器,不要将其放入工作内存,而是直接在主存操作。因此,当多处理器或多线程在访问该变量时

都将直接操作主存,这在本质上做到了变量共享。

volation优势:

1.更大的程度吞吐量

2.更少的代码实现多线程

3.程序伸缩性好

4.比较好理解,无需太高的学习成本

volatile不足:

1.容易出问题

2.比较难设计

参考文献

http://yiminghe.iteye.com/blog/404334

http://developer.51cto.com/art/201103/249322.htm

 

本文转自:http://www.blogjava.net/wangchenyang/archive/2011/09/05/363081.html

分享到:
评论

相关推荐

    单例设计模式的优缺点和设计思想

    1. **线程安全**:在高并发环境下,必须注意单例模式的线程同步问题,避免多个线程同时创建实例导致的不一致性。 2. **对象复制问题**:需要防止通过序列化或反射机制创建额外的实例,这可能破坏单例模式的一致性。 ...

    java单例模式实例

    总结起来,Java中的单例模式有多种实现,每种都有其优缺点。开发者应根据项目需求选择适合的实现方式,比如对性能要求较高的场景可以选择静态内部类或枚举,而对内存占用敏感的场景则可能更适合饿汉式。通过学习和...

    单例模式---初学 优点--缺点

    单例模式的缺点: 1. **系统开销**:虽然单例模式可以减少不必要的对象创建,但在某些情况下,过度依赖单例可能会增加系统的复杂性和内存占用,尤其是在大型项目中。 2. **开发混淆**:由于隐藏了实例化的细节,...

    C#单例模式详解 C#单例模式详解C#单例模式详解

    然而,单例模式也有一些缺点: - 打破了单一职责原则,因为单例类不仅要处理业务逻辑,还要管理自己的实例化。 - 单例模式难以进行单元测试,因为它没有公共的构造函数,使得模拟对象变得困难。 - 难以解耦,单例...

    java:单例模式 作为对象的创建模式

    单例模式是设计模式中的一种,它在Java编程中被广泛应用,主要目的是限制类的实例化,确保在程序运行期间,对于某个特定类,只存在一个全局共享的对象。这种模式通常用于那些需要频繁实例化然后销毁,或者创建代价...

    单例模式各种实现方式

    在Java中,实现单例模式有多种方法,每种都有其特定的优缺点和适用场景。以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的...

    7种单例模式

    单例模式是软件设计模式中的一种经典模式,其主要...总结起来,单例模式有多种实现方式,每种方式都有其适用场景和优缺点。在实际应用中,开发者应根据项目需求选择合适的单例实现,并注意线程安全和反序列化等问题。

    几种单例模式demo

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、管理共享配置或者创建昂贵的对象时避免频繁创建销毁。 ...

    设计模式之单例模式源码demo

    以上就是单例模式的常见实现方式,每种都有其适用场景和优缺点。在实际开发中,应根据项目需求和环境选择合适的单例模式实现。在设计模式中,单例模式不仅限于上述实现,还可以与其他模式结合使用,如工厂模式、装饰...

    设计模式C++学习之单例模式(Singleton)

    在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于控制类的实例化过程,防止多处代码创建多个实例导致资源的浪费或者状态不一致的问题。在...

    Java 单例模式.pptx

    #### 三、单例模式的创建方式及优缺点 单例模式的实现方式主要有三种:饿汉式、懒汉式以及静态内部类方式。 - **饿汉式** - **实现**: ```java public class Single1 { // 创建一个静态的实例 private ...

    单例模式PHP实现代码类.zip

    4. **单例模式的缺点**: - 反对依赖注入:由于单例模式控制了实例化过程,使得外部难以替换或模拟这个类的实例,不利于单元测试和解耦。 - 延迟加载:单例模式往往在第一次调用`getInstance()`时就创建了实例,...

    单例模式详解

    懒汉式单例是在使用时才创建实例的单例模式。这种方式的优点是避免了无用的创建过程,但缺点是需要加锁以保证线程安全。 ```java public class Singleton { // 私有的默认构造子 private Singleton() {} // 已经...

    单例模式的要点及模式

    ### 三、单例模式的应用场景与优缺点 **应用场景**: - 全局日志对象 - 数据库连接池 - 缓存服务 - 线程池 - 多线程环境下的线程同步控制 **优点**: - 节省内存空间,减少系统资源消耗。 - 避免对资源的多重占用...

    单例模式.ppt

    【单例模式】是一种常用的软件设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。在软件开发中,单例模式常用于管理共享资源或者需要协调多个组件交互的场景,比如数据库连接池、日志服务等。 ...

    单例模式单例模式单例模式

    #### 四、单例模式的优缺点 ##### 优点 - **减少内存开销**:避免了多次创建不必要的对象实例,节省了内存空间。 - **方便全局访问**:通过单例模式可以方便地获取对象实例,无需重复创建。 - **便于扩展**:由于...

    OC单例模式讲解

    ### OC单例模式讲解 #### 一、单例模式简介 单例模式是设计模式中的一种,属于创建型...通过本文的介绍,我们了解了单例模式的概念、实现方法以及其优缺点。希望这些内容能够帮助开发者更好地理解和应用单例模式。

    设计模式单例模式PPT学习教案.pptx

    两种实现方式都可以实现单例模式,但是它们有不同的优缺点。 单例模式是一种常用的设计模式,用于确保系统中只有一个实例存在,并提供了一个全局访问点来访问该实例。它可以应用于各种系统,如服务器负载均衡器、...

    关于单例模式的知识要点

    下面我们将深入探讨单例模式的实现方式、优缺点以及在实际开发中的应用。 首先,单例模式的三个核心特性如描述中所提到: 1. **唯一实例**:在程序运行期间,单例类只能被实例化一次。这通常通过将构造函数设为私有...

Global site tag (gtag.js) - Google Analytics