设计模式(三)——单例模式
本文讲述单例模式
单例模式很简单,就是将默认的构造函数私有化,这样在外部就无法直接创建该类的实例,而实例的创建都放在该类中,并且只有一份,这里不假设具体的场景了,直接看代码就好:
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连接池的写法,这里我就不多说了。