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

    ```
    单例模式 >>> 对象创建模式 >>> 确保一个类只有一个实例
    ```
    ```
    只有一个实例、类内部创建唯一实例、对外提供该唯一实例
    ```
    ```
    // ①懒汉式,线程不安全
    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;
        private Singleton (){}
    
        public static synchronized Singleton getInstance() {
         if (instance == null) {
             instance = new Singleton();
         }
         return instance;
        }
    }
    // 线程安全、但并不高效、同一时刻只能有一个线程访问该方法、同步操作只需要在第一次调用创建对象时才被需要、获取对象时并不需要同步
    
    ```
    ```
    // ③双重检验锁
    // 双重检验锁模式(double checked locking pattern),是一种使用同步块加锁的方法
    public class Singleton {
        private static Singleton instance;
        private Singleton (){}
    
        public static Singleton getInstance() {
        if (instance == null) {                         //Single Checked
            synchronized (Singleton.class) {
                if (instance == null) {                 //Double Checked
                    instance = new Singleton();      // 并非是一个原子操、jvm存在指令重排序的优化作、分配内存、初始化、指向内存空间、
                }
            }
        }
        return instance ;
      }
    }
    ```
    ```
    // ③双重检验锁 优化 volatile 
    public class Singleton {
        private volatile static Singleton instance; //声明成 volatile
        private Singleton (){}
    
        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
        
    }
    ```
    ```
    // ④饿汉式 static final field
    public class Singleton {
        // 在装载类的时候就创建对象实例
        private  static final Singleton instance=new Singleton();
        private Singleton (){}
    
        public static Singleton getInstance() {
            return instance;
        }
    }
    // 非惰性加载模式、无法在实例的创建依赖参数或者配置文件的时候使用、在 getInstance() 之前必须调用某个方法设置参数给它,那样这种单例写法就无法使用了
    ```
    ```
    // ⑤静态内部类 static nested class
    // 这种方法也是《Effective Java》上所推荐的
    public class Singleton {  
        private static class SingletonHolder {  
            private static final Singleton INSTANCE = new Singleton();  
        }  
        private Singleton (){}  
        public static final Singleton getInstance() {  
            return SingletonHolder.INSTANCE; 
        }  
    }
    ```
    ```
    // ⑥枚举 Enum
    public enum Singleton{
        INSTANCE;
    }
    ```
  • 相关阅读:
    Android测试入门篇
    SQL的基本知识
    正则表达式
    ES5语法
    vscode
    继承小结
    工作遇到的问题
    后台程序员的HTTP缓存
    xhr下载图片/服务器向客户端推送消息
    HTTP2.0
  • 原文地址:https://www.cnblogs.com/xiaofeifei-wang/p/10492851.html
Copyright © 2011-2022 走看看