设计模式之【单例模式】

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于建立型模式,它提供了一种建立对象的最佳方式。java

这种模式涉及到一个单一的类,该类负责建立本身的对象,同时确保只有单个对象被建立。这个类提供了一种访问其惟一的对象的方式,能够直接访问,不须要实例化该类的对象。设计模式

注意:安全

  • 一、单例类只能有一个实例。
  • 二、单例类必须本身建立本身的惟一实例。
  • 三、单例类必须给全部其余对象提供这一实例。

实现方式

懒汉式、线程不安全

描述:最基本的实现方式,在外部调用时才会加载,线程不安全线程

public class LazySingleton {
    private static LazySingleton intstance;
    public LazySingleton(){}

    public static LazySingleton getInstance(){
        if (intstance == null){
            intstance = new LazySingleton();
        }
        return intstance;
    }
}

懒汉式、线程安全

描述:线程安全,必须加锁 synchronized 才能保证单例,但加锁会影响效率设计

public class LazySingleton {
    private static LazySingleton intstance;
    private LazySingleton(){}

    public static synchronized LazySingleton getInstance(){
        if (intstance == null){
            intstance = new LazySingleton();
        }
        return intstance;
    }
}

饿汉式

描述:在类加载时就初始化建立对象,线程安全,但无论是否使用都建立对象可能会浪费内存code

public class HungrySingleton {
    private static HungrySingleton intstance = new HungrySingleton();
    private HungrySingleton(){}

    public static  HungrySingleton getInstance(){
        return intstance;
    }
}

双重检查锁

描述:使用volatile以及多重检查来减少锁范围,提高效率对象

public class DoubleCheckSingleton {
   private DoubleCheckSingleton(){}
   private volatile static DoubleCheckSingleton instance;

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

静态内部类

描述:同时解决饿汉式的内存浪费问题和懒汉式的线程安全问题内存

public class StaticSingleton {
    private StaticSingleton(){}
    private static class StaticClass{
        public static final StaticSingleton instance = new StaticSingleton();
    }
    
    public static StaticSingleton getInstance(){
        return StaticClass.instance;
    }
}

枚举

描述: Effective Java 做者 Josh Bloch 提倡的方式,不只能防止反序列化从新建立新的对象,绝对防止屡次实例化,也能防止反射破解单例的问题get

public enum EnumSingleton {
    INSTANCE;
}
相关文章
相关标签/搜索