单例模式(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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。