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

    定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

         Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例。

    分类:

      懒汉式(时间换空间):不加同步时线程不安全

        1.线程不安全

    public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
      
        public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  
    }  

        2.线程安全(加锁,效率慢)

    public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
        public static synchronized Singleton getInstance() {  
          if (instance == null) {  
              instance = new Singleton();  
          }  
          return instance;  
        }  
    }  

        3.双重加锁机制

        双重加锁机制,指的是:并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入下面的同步块,这是第一重检查。进入同步块后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例。这是第二重检查。

    /**
     * 双重检查加锁的单例模式
     * @author dream
     *
     */
    public class Singleton {
    
        /**
         * 对保存实例的变量添加volitile的修饰
         */
        private volatile static Singleton instance = null;
        private Singleton(){
            
        }
        
        public static Singleton getInstance(){
            //先检查实例是否存在,如果不存在才进入下面的同步块
            if(instance == null){
                //同步块,线程安全的创建实例
                synchronized (Singleton.class) {
                    //再次检查实例是否存在,如果不存在才真正的创建实例
                    instance = new Singleton();
                }
            }
            return instance;
        }
        
    }

      饿汉式(空间换时间):线程安全

        1.第一种

    public class Singleton {  
        private static Singleton instance = new Singleton();  
        private Singleton (){}  
        public static Singleton getInstance() {  
          return instance;  
        }  
    }  

        2.第二种

    public class Singleton {  
        private Singleton instance = null;  
        static {  
        instance = new Singleton();  
        }  
        private Singleton (){}  
        public static Singleton getInstance() {  
        return this.instance;  
        }  
    }  

      

      静态内部类(实现延迟加载)

    public class Singleton {
    
        /**
         * 类级的内部类,也就是静态类的成员式内部类,该内部类的实例与外部类的实例
         * 没有绑定关系,而且只有被调用时才会装载,从而实现了延迟加载
         * @author dream
         *
         */
        private static class SingletonHolder{
            /**
             * 静态初始化器,由JVM来保证线程安全
             */
            private static final Singleton instance = new Singleton();
        }
        
        /**
         * 私有化构造方法
         */
        private Singleton(){
            
        }
        
        public static Singleton getInstance(){
            return SingletonHolder.instance;
        }
    }

    单例模式应用场景:

      1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~

      2. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。

      3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。

      4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

      5. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。

      6. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。

      7. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。

      8. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。

      9. HttpApplication 也是单位例的典型应用。熟悉ASP.NET(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例.

    总结以上,不难看出:

      单例模式应用的场景一般发现在以下条件下:

      (1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。

      (2)控制资源的情况下,方便资源之间的互相通信。如线程池等。

  • 相关阅读:
    设计模式 go语言实践-5 外观模式
    .net 5 preview发布
    设计模式 Vs实践-4 桥接模式
    设计模式 Vs实践-3 装饰器模式
    PowerDesign字段和中文名切换显示
    设计模式 Vs实践-2 抽象工厂模式
    设计模式 Vs实践-1 工厂模式
    环境变量path的值大于1024的解决办法
    powshell 输出字符编码的问题,设置为utf-8
    模拟真实点击click,专门对付clickoutside
  • 原文地址:https://www.cnblogs.com/yl-saber/p/6950606.html
Copyright © 2011-2022 走看看