3

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

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

实现方式

懒汉式、线程不安全

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

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;
    }
}

饿汉式

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

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 提倡的方式,不仅能防止反序列化重新创建新的对象,绝对防止多次实例化,也能防止反射破解单例的问题

public enum EnumSingleton {
    INSTANCE;
}

thirtyyy
16 声望0 粉丝

生活如水,时而浑浊,时而清澈