不一样的单例模式(设计模式九)
前言
单例较为简单,所以直接就写代码了。
正文
加载的时候实例化
private static Person person=new Person();
首次使用的时候实例化
private static Person person;
Static Person()
{
person=new Person();
}
双检查法
if(person==null)
{
lock(object)
{
if(person!=null)
{
person=new Person();
}
}
}
return person;
双检查法 存在的问题,在于reorder。
是这样子的person=new Person()的执行顺序为为person 分配空间,然后实例化,然后给person赋值指针地址。
但是呢,可能出现下面这种情况分配空间,然后给person赋值指针地址,然后实例化。
这样参数的问题,就是person不为空,但是又没有实例化,所以返回的person是有问题的。
这个怎么解决呢?
1.方案一
private static volatile Singleton sInstance;
2.方案二
public class Singleton {
private Singleton(){};
private static class Inner{
private static Singleton SINGLETION=new Singleton();
}
public static Singleton getInstance(){
return Inner.SINGLETION;
}
}
静态内部类不会随着外部类的初始化而初始化,他是要单独去加载和初始化的,当第一次执行getInstance方法时,Inner类会被初始化。
所以我们发现在别人的开源代码中一般都是方案二,非常常见,双检查法在现在互联网项目中是存在问题得。