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

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

  • 相关阅读:
    云原生生态周报 Vol. 16 | CNCF 归档 rkt,容器运行时“上古”之战老兵凋零
    Knative 基本功能深入剖析:Knative Eventing 之 Sequence 介绍
    基于 K8s 做应用发布的工具那么多, 阿里为啥选择灰姑娘般的 Tekton ?
    Serverless 的喧哗与骚动(一)附Serverless行业发展回顾
    239. Sliding Window Maximum
    237. Delete Node in a Linked List
    146. LRU Cache
    140. Word Break II
    165. Compare Version Numbers
    258. Add Digits
  • 原文地址:https://www.cnblogs.com/LvLoveYuForever/p/5799922.html
Copyright © 2011-2022 走看看