双重检查讲解
public class LazyDoubleCheckSingleton {
private static LazyDoubleCheckSingleton lazyDoubleCheckSingleton=null;
private LazyDoubleCheckSingleton(){}
public static LazyDoubleCheckSingleton getInstance(){
if(lazyDoubleCheckSingleton==null){
//保证只有一个线程创建对象
synchronized (LazyDoubleCheckSingleton.class){
if(lazyDoubleCheckSingleton==null){
lazyDoubleCheckSingleton=new LazyDoubleCheckSingleton();
/*
new LazyDoubleCheckSingleton()发生的步骤:
1.分配内存给对象
2.初始化对象
3.设置 lazyDoubleCheckSingleton指向刚分配的内存
多线程时2,3步骤可能颠倒
*/
}
}
}
return lazyDoubleCheckSingleton;
}
}
可能发生的问题
new LazyDoubleCheckSingleton()发生的步骤:
1.分配内存给对象
2.初始化对象
3.设置 lazyDoubleCheckSingleton指向刚分配的内存
实际运行时第2,3步骤可能颠倒
多线程时发生的问题
解决方法一:
Volatile
1.保证内存可见性
2.防止重排序
预防措施加 Volatile:
解决方法二:
通过静态内部类
public class StaticInnerClassSingleton {
private static class InnerClass{
private static StaticInnerClassSingleton staticInnerClassSingleton=new StaticInnerClassSingleton();
}
public static StaticInnerClassSingleton getInstance(){
return InnerClass.staticInnerClassSingleton;
}
//私有构造器一定要有,否则外部可以NEW出
private StaticInnerClassSingleton(){
}
}