`
haoningabc
  • 浏览: 1482096 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单例模式7中

    博客分类:
  • java
阅读更多
package com.sohu.zookeeper;

//第一种(懒汉,线程不安全):
public class Singleton {
	private static Singleton instance;

	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}


// 这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。 第二种(懒汉,线程安全):
public class Singleton {
	private static Singleton instance;

	public static synchronized Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}


// 这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。 第三种(饿汉):
public class Singleton {
	private static Singleton instance = new Singleton();

	private Singleton() {
	};

	public static Singleton getInstance() {
		return instance;
	}
}


// 这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,
// 虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法,
// 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,
// 这时候初始化instance显然没有达到lazy loading的效果 第四种(饿汉,变种):
public class Singleton {
	private Singleton instance = null;
	static {
		instance = new Singleton();
	}

	public static Singleton getInstance() {
		return this.instance;
	}
} 

// 表面上看起来差别挺大,其实更第三种方式差不多,都是在类初始化即实例化instance。 第五种(静态内部类):

public class Singleton {
	private static class SingletonHolder {
		private static final Singleton INSTANCE = new Singleton();
	}

	public static final Singleton getInstance() {
		return SingletonHolder.INSTANCE;
	}
}


// 这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,
// 它跟第三种和第四种方式不同的是(很细微的差别):第三种和第四种方式是只要Singleton类被装载了,
// 那么instance就会被实例化(没有达到lazy
// loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。
// 因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,
// 从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,
// 我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,
// 那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三和第四种方式就显得很合理。
// 第六种(枚举):
public enum Singleton {
	INSTANCE;
	public void whateverMethod() {
	}
}


// 这种方式是Effective Java作者Josh Bloch
// 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,
// 不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
// 第七种(双重校验锁):
public class Singleton {
	private volatile static Singleton singleton;

	public static Singleton getSingleton() {
		if (singleton == null) {
			synchronized (Singleton.class) {
				if (singleton == null) {
					singleton = new Singleton();
				}
			}
		}
		return singleton;
	}
}

分享到:
评论

相关推荐

    7种单例模式

    单例模式是软件设计模式中的一种经典模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制共享资源、管理配置对象等。下面将详细介绍七种常见的单例模式实现...

    Java设计模式之单例模式的七种写法

    在 Java 中,单例模式的写法有好几种,主要有懒汉式单例、饿汉式单例、登记式单例等。 懒汉式单例是一种常见的单例模式实现方式,它在第一次调用的时候实例化自己。下面是懒汉式单例的四种写法: 1、基本懒汉式...

    几种单例模式demo

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

    java单例模式在android中的应用

    7. Service管理:当多个组件需要共享同一个Service实例时,单例模式是理想的选择。 8. 全局事件总线:如EventBus,通过单例模式实现事件的发布和订阅,确保事件传递的统一性。 9. 日志管理:日志记录器使用单例,...

    单例模式应用场景

    尽管有些设计模式专家认为它过于简单而不能称为真正的“模式”,但单例模式因其简洁性和实用性,在多个场景中发挥着重要作用。 #### 二、应用场景分析 **1. Windows Task Manager(任务管理器)** 任务管理器是...

    工厂模式与单例模式

    在软件设计模式中,工厂模式和单例模式是两种非常基础且重要的模式,它们都是用于解决对象创建问题,但有着不同的设计理念和应用场景。本篇文章将深入探讨这两种模式,并结合具体的代码示例`myFactoryDemo`进行讲解...

    设计模式-单例模式

    单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池或者配置管理等。 在Java中...

    单例模式源代码

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处包括资源管理(如数据库连接)、性能优化(如缓存服务)以及...

    关于单例模式的知识要点

    单例模式是软件设计模式中的一种,其主要目的是控制类的实例化过程,确保一个类在整个应用程序中只有一个实例存在。这种模式在很多场景下都非常有用,例如管理共享资源、配置对象或者全局日志服务等。下面我们将深入...

    单例模式.zip(c#设计模式)

    在《设计模式》第二版中,刘伟老师深入讲解了单例模式,本压缩包中的"单例模式习题6"和"单例模式习题7"可能是书中的课后练习,旨在帮助读者更好地理解和运用单例模式。 单例模式的核心思想是控制类的实例化过程,...

    单例模式的七种写法

    单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制数据库连接、管理缓存或者全局配置等。下面我们将详细探讨单例模式的七种...

    实验五:单例模式.rar

    单例模式是软件设计模式中的一种经典模式,它主要用于控制类的实例化过程,确保一个类在整个应用程序中只有一个实例存在。这种模式在Java编程中非常常见,特别是在需要频繁实例化然后销毁的对象,或者需要共享资源的...

    单例模式的几种实现方式

    单例模式是软件设计模式中的一种经典模式,它限制了类的实例化过程,确保一个类在整个系统中只有一个实例存在。这种模式在处理全局资源、线程共享对象以及频繁使用的对象时尤其有用,因为它可以避免频繁创建和销毁...

    最全的单例模式j(java实现),下到就是赚到!

    单例模式是软件设计模式中的一种经典模式,它限制一个类只能有一个实例存在。在Java中,单例模式常用于管理共享资源,如数据库连接池、线程池或配置信息等,以确保这些资源在整个应用生命周期中只被创建一次。在多...

    qt 单例模式,模板

    7. **SingleTest.h**和`SingleTest.ui`:这分别是测试类的头文件和UI设计文件,可能用于创建一个简单的界面来展示单例模式的工作情况。 8. **SingleTest.qrc**:这是一个资源文件,用于将非代码资源(如图像、音频...

    软件体系结构单例模式

    单例模式是软件设计模式中的一种经典模式,它在软件体系结构中扮演着重要的角色。这个模式的主要目的是确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种设计模式广泛应用于...

    单例模式代码和文档

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在资源管理、配置对象、线程池等场景中非常常见,因为这些场景往往需要确保系统中只有一个实例来协调整个系统的状态。...

    java模式设计之单例模式

    7. **Java中的单例模式实现** - **代码清单1(饿汉式)**: ```java public class EagerSingleton { private static final EagerSingleton m_instance = new EagerSingleton(); private EagerSingleton() {} ...

    单例模式讲解案例

    单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类在整个程序运行期间只有一个实例存在。这种模式常被用于管理共享资源,如数据库连接、线程池或者配置文件等,以减少系统资源的浪费并提高效率。...

    设计模式—— 七 :单例模式

    单例模式是23个模式中比较简单的模式,应用也非常广泛 什么是单例模式? 单例模式的定义: Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类 只有一个实例...

Global site tag (gtag.js) - Google Analytics