美文网首页面试
面试题汇总(设计模式)

面试题汇总(设计模式)

作者: 王勇1024 | 来源:发表于2019-11-02 19:46 被阅读0次

    单例模式

    参考:
    漫画:什么是单例模式?
    单例模式的七种写法

    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. 懒汉模式(线程安全)

    public class Singleton {  
          private static Singleton instance;  
          private Singleton (){
          }
          public static synchronized Singleton getInstance() {  
          if (instance == null) {  
              instance = new Singleton();  
          }  
          return instance;  
          }  
     }  
    
    • 线程安全
    • 每次调用getInstance方法时都需要进行同步,造成不必要的同步开销

    4. 双重检查模式 (DCL)

    public class Singleton {  
          private volatile static Singleton instance;  
          private Singleton (){
          }   
          public static Singleton getInstance() {  
          if (instance== null) {  
              synchronized (Singleton.class) {  
              if (instance== null) {  
                  instance= new Singleton();  
              }  
             }  
         }  
         return singleton;  
         }  
     }  
    
    • 启动速度快
    • 第一次加载时反应稍慢一些
    • 线程安全,效率高

    5. 静态内部类单例模式

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

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

    6. 枚举单例

    public enum Singleton {  
         INSTANCE;  
         public void doSomeThing() {  
         }  
     }  
    
    • 线程安全的,并且在任何情况下都是单例
    • 使用简单

    7. 使用容器实现单例模式

    典型应用:Spring

    有什么办法可以打破单例模式?

    1. 反射
    2. 序列化和反序列化

    相关文章

      网友评论

        本文标题:面试题汇总(设计模式)

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