设计模式之单例设计模式

public class Singleton{

  private static Singleton uniqueInstance;

  private Singleton(){}

  public static syschronized Singleton getInstance(){

    if(uniqueInstance == null){

      uniqueInstance=new Singleton();

    }

    return uniqueInstance;

  }

}

为了避免在多线程的情况下的灾难,需要在getInstance()方法加上线程同步关键字。

1>使用同步,可能造成程序执行效率下降100倍。如果我们可以接受同步造成的额外负担,就可以忽略。如果不能接受,那么就有可能需要重新考虑了。

2>使用及切的方式创建实例,而不是延迟实例化的做法

  

public class Singleton{

  private static Singleton uniqueInstance = new Singleton();

  private Singleton(){}

  public static Singleton getInstance(){

    return uniqueInstance;

  }

}

这种方式保证了在任何线程访问uniqueInstance之前,一定创建此实例了。

过早实例化,如果空闲的存在,这也是一种资源的浪费。

3>如果性能是你关心的重点,那么可以使用 ‘双重检查加锁’ ,在getInstance()中减少使用同步(volatile只是保存主内存的变量是最新值)

public class Singleton{

  private volatile static Singleton uniqueInstance;

  private Singleton(){}

  public static  Singleton getInstance(){

    if(uniqueInstance == null){

     synchronized(Sington.class){

        if(uniqueInstance == null){

          uniqueInstance = new Singleton();

        }

      }

    }

    return uniqueInstance;

  }

}

这个做法可以帮你大大地减少getInstance()的时间消耗。

在1.4及更早的版本的java中,许多jvm对于volatile关键字的实现会导致双重检查加锁的失效。如果不能使用java5及以后的版本。

就请不要使用此技巧来使用单例设计模式。

原文地址:https://www.cnblogs.com/LvLoveYuForever/p/5799922.html