`
hkme
  • 浏览: 138660 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Singleton安全

阅读更多

单例模式的一般例子:

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