zoukankan      html  css  js  c++  java
  • 设计模式之单例设计模式

    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及以后的版本。

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

  • 相关阅读:
    D2. Remove the Substring (hard version)(思维 )
    暑假集训
    AcWing:167. 木棒(dfs + 剪枝)
    AcWing:109. 天才ACM(倍增 + 归并排序)
    AcWing:99. 激光炸弹(前缀和)
    B. Interesting Array(线段树)
    Best Reward HDU
    G. Swapping Places
    How many HDU
    GSS4&&花仔游历各国
  • 原文地址:https://www.cnblogs.com/LvLoveYuForever/p/5799922.html
Copyright © 2011-2022 走看看