不一样的单例模式(设计模式九)

前言

单例较为简单,所以直接就写代码了。

正文

加载的时候实例化

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类会被初始化。

所以我们发现在别人的开源代码中一般都是方案二,非常常见,双检查法在现在互联网项目中是存在问题得。

原文地址:https://www.cnblogs.com/aoximin/p/13599533.html