话题切入正题,不说其他太多的。
推荐:全文可见
http://www.cnblogs.com/xudong-bupt/p/3433643.html
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static Singleton getInstance(){ //对获取实例的方法进行同步
if (instance == null){
synchronized(Singleton.class){
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
上面的方法还不是完全正确的 还是存在一些弊端的
我们先需要知道如下知识点
对象正常创建顺序,出现情况的为第二种
如上 当我们有A B 线程创建的时候,当A线程访问到 第创建 new SingletonExample 的时候,他创建对象的顺序出现问题了,他不先初始化对象在把引用指向那块区域,而是先指向后初始化对象。
当他在指向的时候又没有初始化对象当时,B线程刚刚好访问 if(instance == null){}然后就返回回去 instance 此时就会出现错误了,因为此时的 instance 并没有初始化。
public class Singleton {
private volatile static Singleton instance;
private Singleton (){
}
public static Singleton getInstance(){ //对获取实例的方法进行同步
if (instance == null){
synchronized(Singleton.class){
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
我们在继续对对象 使用关键字 volatile 他就能够保证 对象创建的有序性,让他不会进入重排序。