《Head First设计模式》读书笔记 -- (第五章)单件模式

本章要点:

1.单件模式确保程序中一个类最多只有一个实例。

2.单件模式也提供访问这个实例的全局点。

3.在Java中实现单件模式需要私有构造器、一个静态方法和一个静态变量。

4.确定在性能和资源上的限制,然后小心地选择适当的方案来实现单件,以解决多线程的问题(我们必须认定所有的程序都是多线程的)。

5.如果不是采用第五版的Java 2,双重检查加锁实现会失效。

6.小心,你如果使用多个类加载器,可能导致单件失效而产生多个实例。

7.如果使用JVM 1.2或之前的版本,你必须建立单件注册表,以免垃圾收集器将单件回收。

----------------------------------------分割线 ----------------------------------------

单件模式类图


懒汉式,特点就是延迟加载

public class Singleton {
	private static Singleton uniqueInstance;
	
	private Singleton(){}
	//我们默认所有程序都是多线程的
	public static synchronized Singleton getInstance(){
		if(uniqueInstance == null){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
}
实际上,只有第一次执行此方法时,才真正需要同步。换句话说,一旦设置好uniqueInstance变量,就不再需要同步这个方法了,之后每次调用这个方法,同步都是一种累赘。

我们可以进行优化

1.如果getInstance()的性能对应用程序不是很关键,就什么都别做

2.使用饿汉式

public class Singleton {
	//在静态初始化器中创建单件,保证了线程安全
	private static Singleton uniqueInstance = new Singleton();
	
	private Singleton(){}
	
	public static synchronized Singleton getInstance(){
		return uniqueInstance;
	}
}
3.用双重检查枷锁,在getInstance()中减少使用同步

public class Singleton {
	//当uniqueInstance变量被初始化成Singleton实例时,多个线程正确地处理uniqueInstance变量
	private volatile static Singleton uniqueInstance;
	
	private Singleton(){}
	
	public static synchronized Singleton getInstance(){
		//如果不存在,进入同步区块
		if(uniqueInstance == null){
			//进入区块后,再检查一次。如果仍是null,才创建实例
			synchronized (Singleton.class) {
				if(uniqueInstance == null){
					uniqueInstance = new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值