论坛首页 编程语言技术论坛

设计模式(三)——单例模式

浏览 1185 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-04  

设计模式(三)——单例模式

 

本文讲述单例模式

单例模式很简单,就是将默认的构造函数私有化,这样在外部就无法直接创建该类的实例,而实例的创建都放在该类中,并且只有一份,这里不假设具体的场景了,直接看代码就好:

 

public class SingletonPattern {
	private static SingletonPattern singletonPattern= null;
	//限制住不能直接产生一个实例
	private SingletonPattern(){

	}

	public SingletonPattern getInstance(){

		if(this.singletonPattern == null){ //如果还没有实例,则创建一个
			this.singletonPattern = new SingletonPattern();
		}
	return this.singletonPattern;
	}
}

 

 一般来说通用的单例模式就如上所述,但是我们会发现这样写在某些情况下会有问题,假如现在有两个线程A 和线程B,线程A 执行到 this.singletonPattern =new SingletonPattern(),正在申请内存分配,可能需要0.001 微秒,就在这0.001 微秒之内,线程B 执行到if(this.singletonPattern == null),你说这个时候这个判断条件是true 还是false?是true,那然后线程B 也往下走,于是乎就在内存中就有两个SingletonPattern 的实例了,这样就会导致问题。那我们修改如下:

public class SingletonPattern2 {
	private static final SingletonPattern2 singletonPattern= new
			SingletonPattern2();
			//限制住不能直接产生一个实例
			private SingletonPattern2(){

			}
			public synchronized static SingletonPattern2 getInstance(){
				return singletonPattern;
			}
}
 这样问题就引刃而解了,当然,要解决上述问题,写法不一定只有这一种,至少我感觉这是可行的。要说的实际应用,最常用的就是数据库的连接池了,有空可以看下c3p0连接池的写法,这里我就不多说了。

 

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics