论坛首页 入门技术论坛

singleton模式安全

浏览 1119 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-04-17  
单例模式的一般例子:

public class Singleton{

private static Singleton instance = null;

public static  Singleton getInstance(){

if(instance == null){

instance  = new Singleton();

}

return instace;

}

}假设这样一个场景,有两个线程调用Singleton.instance(),首先线程一判断instance是否等于null,判断完后一瞬间虚拟机把线程二调度为运行线程,线程二再次判断instance是否为null,然后创建一个Singleton实例,线程二的时间片用完后,线程一被唤醒,接下来它执行的代码依然是instance = new Singleton();
两次调用返回了不同的对象,出现问题了。
解决方案:(1)类被载入时就初始化这个对象:private static Singleton instance = new Singleton();
JLS(Java Language Specification)中规定了一个类只会被初始化一次,所以这样做肯定是没问题的。

但是如果要实现延迟初始化(Lazy initialization),比如这个实例初始化时的参数要在运行期才能确定
(2)使用synchronized关键字修饰初始化方法:

public synchronized static Singleton getInstace() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}


论坛首页 入门技术版

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