浏览 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连接池的写法,这里我就不多说了。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |