适用场景
对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象。
单利模式的分类
饿汉式:一开始就很饿,立马吃到肚子里。
懒汉式:当别人给我喂食时,我就张口吃掉。
两者的区别?
饿汉式:线程安全,由JVM保证。
懒汉式:线程不安全。
代码示例
饿汉式
//饿汉式单例类.在类初始化时,已经自行实例化 public class Singleton1 { //私有的默认构造子 private Singleton1() {} //已经自行实例化 private static final Singleton1 INSTANCE= new Singleton1(); //静态工厂方法 public static Singleton1 getInstance() { return INSTANCE; } }
懒汉式 (存在线程安全问题)
//懒汉式单例类.在第一次调用的时候实例化 public class Singleton2 { //私有的默认构造子 private Singleton2() {} //注意,这里没有final private static Singleton2 single; //静态工厂方法 public static Singleton2 getInstance() { if (single == null) { single = new Singleton2(); } return single; } }
懒汉式 (存在线程安全问题)改进型1
利用静态内部类特性实现外部类的单例,线程安全并且高效
public class Singleton3 { private static class SingleTonBuilder { private static Singleton3 singleTon = new Singleton3(); } public static Singleton3 getInstance() { return SingleTonBuilder.singleTon; } }