简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,
任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。
具体实现就是把单例类的构造方法访问权限设置成private,然后在单例类里面定义GetInstance()方法来访问构造方法
GetInstance()通过如下方式保证该 Singleton 只存在一个实例:
首先这个 Singleton 类会在在第一次调用 GetInstance()时创建一个实例,并将这个实例的引用封装在自身类中,
然后以后调用 GetInstance()时就会判断这个 Singleton 是否存在一个实例了,如果存在,则不会再创建实例。
而是调用以前生成的类的实例,这样下来,整个应用程序中便就只存在一个实例了。
public class Singleton
{
private static Singleton singleton=null;
private Singleton()
{
}
public static Singleton GetInstance()
{
if (singleton == null)
{
singleton = new Singleton();
}
return singleton;
}
}
,假如现在有两个线程A和线程B,线程A执行到 this.singletonPattern = new SingletonPattern(),正在申请内存分配,可能需要0.001微秒,就在这0.001微秒之内,线程B执行到if(this.singletonPattern == null),你说这个时候这个判断条件是true还是false?是true,那然后呢?线程B也往下走,于是乎就在内存中就有两个SingletonPattern的实例了,看看是不是出问题了?
如果你这个单例是去拿一个序列号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上还看不出什么问题,这才是最要命的!因为这种情况基本上你是重现不了的,不寒而栗吧,那怎么修改?有很多种方案,我就说一种,能简单的、彻底解决问题的方案:
定义私有变量: private static Singleton singleton=new SingleTon();