单例模式

public Singleton

{

  public static Singleton singleton;

  

  public static Singleton GetInstance()

  {

    if(singleton == null)

    {

      singleton = new Singleton();  

      return singleton;

    }

      return singleton;

  }

}

1、多线程下 使用单例模式时可能会创建多个实例这一现象的解决方案。

可以先将一个线程锁定。

多线程访问GetInstance()中的if语句,比如,有两个线程同时到达

如果Singleton !=null 的话,那么上面的问题是不会存在的,因为已经存在这个实例了,这样的话,所有的线程都无法进入if语句。

也就是所有的线程都无法调用new Singleton()了。

这样还可以保证应用程序生命周期中的实例只有一个。

如果此时singleton == null 的话,那么意味着都是可以进入if语句的。

那么就有可能出现的到哪里中有多个实例的问题。

此时,我可以让一个线程先进入if语句块,然后我在外面对这个if语句块加锁,

对第二个线程呢,由于if语句进行了加锁处理,所以这个进程就无法进入if语句块而处于阻塞状态。

当进入了if语句块的线程完成new Singleton()后,这个线程便会退出if语句块。

此时第二个线程就从

public Singleton

{

  public static Singleton singleton;

  public Object object;

  public static Singleton GetInstance()

  {

    if(singleton == null)//这个是很有必要的,防止每次进入的是都有去锁定程序块,这样如果singleton!=null的时候就不用过去锁定程序快乐

    {

     synchronized(object)

     {

        if(singleton==null)

        {

          

          singleton = new Singleton();  

          return singleton;

        }

     }

      

    }

    return singleton; 

  }

}

原文地址:https://www.cnblogs.com/lobsterIT/p/4884560.html