`
rokuan
  • 浏览: 20513 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

关于单例模式的整理

阅读更多
写法一:
public class Singleton {
	/**
	 * 线程安全,因为jvm在加载类时,对static的属性只能有一个线程执行一次
	 * 比较复杂的创建过程可以放在static{}里面
	 */
	private static Singleton instance = new Singleton();
	
	private Singleton() {}
	
	private static Singleton getInstance() {
		return instance;
	}
}


写法二:
public class LazySingleton {
	private static LazySingleton instance = null;

	private LazySingleton() {}
	
	/*
	 * 在使用的时候创建实例
	 * 需要用synchronized来保证线程安全,不过对整个方法都加了锁,性能不高
	 */
	private static synchronized LazySingleton getInstance() {
		if(instance == null) {
			instance = new LazySingleton();
		}
		return instance;
	}
}


写法三:
public class LazyClassSingleton {
	private LazyClassSingleton() {}
	
	/*
	 * 利用内部类的静态变量创建实例,也是延迟创建
	 */
	private static class SingletonHolder {
		private static final LazyClassSingleton instance = new LazyClassSingleton();
	}
	
	private LazyClassSingleton getInstance() {
		return SingletonHolder.instance;
	}
}


写法四:
public class DoubleCheckSingleton {
	/*
	 * volatile关键字具有synchronized的可见性特点,
	 * 线程能够自动发现volatile变量的最新值
	 */
	private volatile static DoubleCheckSingleton instance = null;
	
	private DoubleCheckSingleton() {}
	
	private static synchronized DoubleCheckSingleton getInstance() {
		if (instance == null) {	//第一次检查,如果不为空,则没必要加锁,直接返回
			synchronized (DoubleCheckSingleton.class) {
				if (instance == null) { //加锁后的第二次检查,确认对象的确还没被创建
					instance = new DoubleCheckSingleton();
				}
			}
		}
		return instance;
	}
}


关于单例模式的序列化:
/*
 * 实现序列化接口的单例类每次被反序列化后都会返回一个新建的实例,
 * 必须实现readResolve方法将返回的实例指向当前的对象
 * 这样当JVM从内存中反序列化地"组装"一个新对象时,
 * 就会自动调用这个 readResolve方法来返回我们指定好的对象了, 单例规则也就得到了保证  
 */
public class SerialibleSingleton implements Serializable {

	private static final long serialVersionUID = -60684598518739226L;
	
	private static SerialibleSingleton instance = new SerialibleSingleton();
	
	private SerialibleSingleton() {}
	
	private static SerialibleSingleton getInstance() {
		return instance;
	}
	
	private Object readResolve() {
		return instance;
	}

}

分享到:
评论

相关推荐

    设计模式之单例模式

    计算机科学与技术课程《设计模式》课程作业,关于单例模式的一些整理,还有基于java的例子。

    单例设计模式

    Java经典的设计 模式单例设计模式,此资源为整理的ppt文档

    c++ 单例模式源码

    本人简单整理了自己所学,singleTon 比较简单,不足之处望指教

    单例模式代码

    wpf单例模式代码,在设计中整理的文档,各种表现形式,相信对大家有用

    单例模式垃圾回收_动力节点Java学院整理

    单例模式是一种常见的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java中,单例模式通常通过静态方法实现,如`getInstance()`,这样可以确保在整个应用程序生命周期中,类只会创建一个对象。然而...

    Java面试 java设计模式整理 单例、工厂、策略等 面试使用,学习使用

    单例模式保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于配置中心、缓存管理等场景,但需要注意线程安全和反序列化问题。 4. **建造者模式(Builder)**: 建造者模式将复杂对象的构建与它的表示...

    Java 单例模式的实现资料整理

    Java 单例模式是一种设计模式,它限制一个类只能有一个实例存在。这种模式在很多场景下非常有用,比如管理共享资源、配置信息等。在Java中,有多种实现单例模式的方法,每种方法都有其优缺点。以下是几种常见的Java...

    Java设计模式整理

    这里我们将深入探讨标题和描述中提到的几种设计模式:简单工厂模式、工厂方法模式、抽象工厂模式、单例模式以及代理模式。 1. **简单工厂模式**: 简单工厂模式是一种创建型设计模式,它提供一个静态方法用于创建...

    设计模式个人整理设计模式个人整理

    单例模式确保一个类只有一个实例,并提供全局访问点。如梦中的情景,家中的“老公”是一个单例,任何时候提到“老公”都指向同一人。单例模式常用于控制资源的共享,如数据库连接或线程池。 6. **结构型模式**: ...

    OO中对于23种设计模式的整理

    单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。 6. 适配器模式(Adapter Pattern) 适配器模式把一个类的接口变换成...

    C#设计模式-整理收藏(吕震宇 设计模式速成经典示例)

    创建型模式如单例模式、工厂方法模式、抽象工厂模式等,关注对象的创建过程,确保在需要时能正确创建对象,同时保持系统设计的灵活性。结构型模式包括适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观...

    java设计模式(收集整理,学习笔记)

    以上是关于Java设计模式中的单例模式和工厂模式的详细介绍。这两种模式都是Java开发者必备的知识点,理解并掌握它们对于编写高质量、易于维护的代码至关重要。在实际项目中,灵活运用这些模式可以提高代码的可读性...

    根据《JAVA与设计模式》整理的笔记及示例代码

    1. 单例模式:保证一个类只有一个实例,并提供全局访问点。 2. 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。 3. 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定...

    c++设计模式中文 个人整理

    创建型模式关注对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)和建造者模式(Builder)。它们提供了一种方式来控制对象的实例化过程,从而简化代码并提高可扩展性。 结构型模式涉及如何组合...

    C++设计模式原理与实战视频课.txt打包整理.zip

    创建型模式关注对象的创建过程,如单例模式、工厂模式和建造者模式等,它们能够帮助我们更好地控制对象的实例化。结构型模式关注类和对象的组合,比如适配器模式、装饰器模式和代理模式等,这些模式能让我们构建更...

    设计模式整理(很全)

    创建模式 设计模式之Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之Factory(工厂方法和抽象工厂) 使用工厂模式就象使用new一样频繁....

    整理 - 设计模式(Design Patterns)- 整理 Word版本

    1. 创建型模式:关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。这些模式帮助我们在程序中控制对象...

Global site tag (gtag.js) - Google Analytics