http://m.nowcoder.com/discuss/35504
你写的单例模式不一定正确
双重检查
class Singleton {
private volatile static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
//这里为什么要两次if呢?
//
//假设是这样的,其并发性能会很低
//100个请求拿单例,都要排着队来取。
//如果多加了一层if在instance不为空的情况下,不用考虑并发问题,100个请求很快也能处理完
public static Singleton getInstance() {
synchronized (Singleton.class) {
if(instance==null)
instance = new Singleton();
}
return instance;
}
singletonObject = new SingletonObject(),这个不是原子操作,它的执行分以下先后三步: 一.给新创建的对象分配内存; 二.调用构造方法初始化成员变量;
三.将singletonObject指向新对象的内存空间