您的位置:首页 > 其它

双重检测单例类

2016-06-15 11:18 309 查看
单例类有很多种,有饿汉式,懒汉式。其中懒汉式由于其两次判断被称为双重检测单例类。

看一段代码。

public class StoreKeeper {
/** 属性列表值. */
private HashMap<String, Store> storepool = null;
private HashMap<String, Long> lifepool = null;
private static StoreKeeper instance;
private StoreKeeper(){
storepool = new HashMap<String, Store>();
lifepool = new HashMap<String, Long>();
}
public static StoreKeeper getInstance(){
if (instance == null) {
synchronized (StoreKeeper.class) {
if (instance == null) {
instance = new StoreKeeper();
}
}
}
return instance;
}


View Code
双重检测单例类即不会每次调用都要获取锁,又做到了延迟加载所以大家都喜欢使用到这种方式,但是双重检测模式在java里面有些问题,主要是JVM会对代码执行重排序等其他的优化策略,所以导致可能返回的实例对象中的成员变量还没有初始化,导致其他线程引用这个对象时得到的成员变量数据不一致,因为获取到的这个实例中的成员变量还未初始化为用户指定的值

解决方法:

在实例变量增加关键字volatile

private static volatileStoreKeeper instance;

这样就不会出现问题了,因为jvm看到有这个volatile关键字就不会对这段代码

进行重排序优化,所以双重检测机制都要求加上这个volatile关键字.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: