zoukankan      html  css  js  c++  java
  • 设计模式--7种单例模式

    定义:一个类只有一个对象实例。

    优点:1,在内存中只有一个对象,节省内存空间。

               2,避免频繁的创建销毁对象,可以提高性能。

               3,避免对共享资源的多重占用。

               4,可以全局访问。

    1. 饿汉模式---在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。 这种方式基于类加载机制避免了多线程的同步问题

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

    2. 懒汉模式(线程不安全)--在用户第一次调用时初始化,虽然节约了资源,但第一次加载时需要实例化,反映稍慢一些,而且在多线程不能正常工作。

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

    3. 懒汉模式(线程安全)---能够在多线程中很好的工作,但是每次调用getInstance方法时都需要进行同步,造成不必要的同步开销,而且大部分时候我们是用不到同步的,所以不建议用这种模式。

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

    4. 双重检查模式 (DCL)--- DCL优点是资源利用率高,第一次执行getInstance时单例对象才被实例化,效率高。缺点是第一次加载时反应稍慢一些,在某些情况下,可能会导致DCL失效

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

    5. 静态内部类单例模式---有第一次调用getInstance方法时虚拟机加载SingletonHolder 并初始化sInstance ,这样不仅能确保线程安全也能保证Singleton类的唯一性,所以推荐使用静态内部类单例模式。

    public class Singleton { 
        private Singleton(){
        }
        public static Singleton getInstance(){  
            return SingletonHolder.sInstance;  
        }  
        private static class SingletonHolder {  
            private static final Singleton sInstance = new Singleton();  
        }  
    } 

    6. 枚举单例---优点就是简单,但是大部分应用开发很少用枚举,可读性并不是很高,不建议用。

    public enum Singleton {  
         INSTANCE;  
         public void doSomeThing() {  
         }  
     }  

    7. 使用容器实现单例模式----用SingletonManager 将多种的单例类统一管理,在使用时根据key获取对象对应类型的对象。这种方式使得我们可以管理多种类型的单例,并且在使用时可以通过统一的接口进行获取操作,降低了用户的使用成本,也对用户隐藏了具体实现,降低了耦合度。

    public class SingletonManager { 
      private static Map<String, Object> objMap = new HashMap<String,Object>();
      private Singleton() { 
      }
      public static void registerService(String key, Objectinstance) {
        if (!objMap.containsKey(key) ) {
          objMap.put(key, instance) ;
        }
      }
      public static ObjectgetService(String key) {
        return objMap.get(key) ;
      }
    }
  • 相关阅读:
    14.4.9 Configuring Spin Lock Polling 配置Spin lock 轮询:
    14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate
    14.4.7 Configuring the Number of Background InnoDB IO Threads 配置 后台InnoDB IO Threads的数量
    14.4.7 Configuring the Number of Background InnoDB IO Threads 配置 后台InnoDB IO Threads的数量
    14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发
    14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发
    14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
    14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
  • 原文地址:https://www.cnblogs.com/mcahkf/p/9034897.html
Copyright © 2011-2022 走看看