单例模式(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;}