单例模式很简单,同时应用范围也很广泛。
什么意思呢?就是说,某个类只能有一个实例。
这里我举个例子,God 对于某个宗教,他们的真神只有一个。
下面看代码
God
-
package designPattern.singleton;
-
-
public class God {
-
-
/**
-
* @param args
-
*/
-
private static God trueGod;
-
-
private God(){
-
//nothing, we can't trust in more than two gods
-
//注意构造函数为私有,这样在这个类外,就不能调用new God();
-
}
-
-
public static God getInstance(){
-
if(trueGod == null){
-
trueGod = new God();
-
}
-
return trueGod;
-
}
-
public void getInfo(){
-
System.out.println("I'm the God :"+trueGod.toString());
-
}
-
-
}
然后是信仰者的类
Believer
-
package designPattern.singleton;
-
-
public class Believer {
-
-
/**
-
* @param args
-
*/
-
public static void main(String[] args) {
-
// TODO Auto-generated method stub
-
//three gods, but all the same one
-
God god1 = God.getInstance();
-
god1.getInfo();
-
-
-
God god2 = God.getInstance();
-
god2.getInfo();
-
-
God god3 = God.getInstance();
-
god3.getInfo();
-
-
}
-
-
}
结果
-
I'm the God :designPattern.singleton.God@1dd61ee4
-
I'm the God :designPattern.singleton.God@1dd61ee4
-
I
看,三个真神,其实都是一个,输出了引用的地址。
单例模式很简单,就是在构造函数中多了加一个构造函数,访问权限是private 的就可以了,这个模
式是简单,但是简单中透着风险,风险?什么风险?在一个B/S 项目中,每个HTTP Request 请求到J2EE
的容器上后都创建了一个线程,每个线程都要创建同一个单例对象,怎么办?
-
if(trueGod == null){
-
trueGod = new God();
-
}
在这段代码中,,假如现在有两个线程A 和线程B,线程A 执行到
trueGod = new God();,正在申请内存分配,可能需要0.001 微秒,就在这0.001 微秒之内,线程B 执
行到
if(trueGod == null),你说这个时候这个判断条件是true 还是false?是true,那然后呢?线程B 也往下走,于是乎就在内存中就有两个SingletonPattern 的实例了。
一个简单的解决方法:
通用代码
-
public class SingletonPattern {
-
private static final SingletonPattern singletonPattern= new
-
SingletonPattern();
-
-
private SingletonPattern(){
-
}
-
public synchronized static SingletonPattern getInstance(){
-
return singletonPattern;
-
}
-
}
阅读(2032) | 评论(1) | 转发(1) |