`
wuhongyu
  • 浏览: 404412 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

JAVA设计模式学习笔记5——单例模式

阅读更多

单例模式——确保一个类只有一个实例,并提供一个全局访问点。

 

    单例模式一般分为懒汉式和恶汉式,懒汉式是说当第一次获取类时才进行类的实例化,饿汉式是说当类被加载时直接实例化。定义单例模式的一般步骤是:

 * 定义一个私有的构造函数,以保证这个类不能被外部程序实例化;
 * 定义一个类的实例变量,以保存这个类的唯一实例;
 * 定义一个获取类唯一实例的静态方法,使外部程序可以获取这个类的唯一实例。

 

懒汉式:

 

public class Singleton {
	private static Singleton uniqueInstance;
 
	private Singleton() {}
 
	public static synchronized Singleton getInstance() {
		if (uniqueInstance == null) {
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
}

    使用synchronized关键字保证获取实例时,如果实例为null,只有一个线程去创建该实例,但这样做会导致效率低下,下面有更好的解决办法

 

线程安全的懒汉式:

 

 

public class Singleton {
	private volatile static Singleton uniqueInstance;

	private Singleton() {}

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

    用“双重检查加锁”,在getInstance中减少使用同步。volatile关键字确保,当uniqueInstance变量被初始化成 Singleton实例时,多个线程正确的处理uniqueInstance变量。注意,1.4及更早的Java中,许多JVM对于volatile关键 字的实现会导致双重加锁失效。

 

 

饿汉式:

public class Singleton {
	private static Singleton uniqueInstance = new Singleton();
 
	private Singleton() {}
 
	public static Singleton getInstance() {
		return uniqueInstance;
	}
}

    饿汉式在类被加载时直接实例化,因此不存在获取实例时的线程安全问题。

 

分享到:
评论
1 楼 di1984HIT 2015-02-06  
用饿汉是不错的。

相关推荐

Global site tag (gtag.js) - Google Analytics