美文网首页
设计模式(六)单件模式-独一无二的对象

设计模式(六)单件模式-独一无二的对象

作者: 天色将变 | 来源:发表于2019-06-26 21:55 被阅读0次
    定义

    单件模式,确保一个类只有一个实例,并提供一个全局访问点。

    为什么会存在这种情况?

    有一些对象其实我们只需要一个,比方说,线程池、缓存、对话框、处理偏好设置和注册表的对象、日志对象,充当打印机、显卡等设备的驱动程序的对象。事实上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源使用过量,或者不一致的结果等。

    经典单件模式(懒汉式)
    • 单线程下有用
    • 延迟创建对象,适用于创建对象后,可能会有沉重的负担情况。
    public class Singleton{
      private static Singleton instance;
      private Singleton(){}
      public static Singleton getInstance(){
        if(instance == null){
          instance = new Singleton();// 用的时候才创建
        }
        return instance;
      }
    }
    
    饿汉式

    创建对象,负担不重时可以这么用

    public class Singleton{
      private static Singleton instance=new Singleton();// 上来就创建实例
      private Singleton(){}
      public static Singleton getInstance(){
        return instance;
      }
    }
    
    多线程单件模式:

    考虑类多线程情况,给加上类synchronized关键字。

    • 但是,同步方法可能造成程序执行效率严重下降,因此在频繁调用的地方需要慎重考虑。
    public class Singleton{
      private static Singleton instance;
      private Singleton(){}
      public static synchronized Singleton getInstance(){
        if(instance == null){
          instance = new Singleton();
        }
        return instance;
      }
    }
    
    双重检查加锁

    在上一个基础上,优化了synchronized同步方法。

    public class Singleton{
      private volatile static Singleton instance;//volatile关键字确保:当instance变量被初始化成单例时,多个线程正确地处理instance变量。
      private Singleton(){}
      public static synchronized Singleton getInstance(){
        if(instance == null){// 只有第一次才彻底执行完代码
          synchronzed(Singleton.class){
            if(instance == null){
                instance = new Singleton();
            }
          }
        }
        return instance;
      }
    }
    

    相关文章

      网友评论

          本文标题:设计模式(六)单件模式-独一无二的对象

          本文链接:https://www.haomeiwen.com/subject/uewhcctx.html