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

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

  • 相关阅读:
    slice和splice的区别
    Js中获取对象的所有key值
    设置layUI的时间laydate 结束时间大于开始时间
    vscode前端常用插件推荐,搭建JQuery、Vue等开发环境
    安装vue脚手架
    es6中...是什么意思
    html转义字符换行以及回车等的使用
    10款让人惊叹的HTML5/jQuery图片动画特效
    基于GIS技术的水利一张图平台
    BIM + 3D GIS在岩溶强发育区跨海盾构隧道施工中的实践应用
  • 原文地址:https://www.cnblogs.com/LvLoveYuForever/p/5799922.html
Copyright © 2011-2022 走看看