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