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

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

  • 相关阅读:
    CSS
    前端初识
    JQuery实现前端增删上下移文字计数
    jq实现去底部去顶部功能
    JQuery选择器,一篇博客就够(非原创)
    input,textarea,select设置默认字体样式
    图片-定义select向下箭头样式
    自定义单选框,复选框样式
    HTML(多行)文本超过部分隐藏,末尾显示(...)
    ZooKeeper可以用来做什么
  • 原文地址:https://www.cnblogs.com/LvLoveYuForever/p/5799922.html
Copyright © 2011-2022 走看看