单例模式
确保一个类只有一个实例,并提供一个全局访问点。单例很简单,最多就是需要考虑下多线程问题。
简单实现
public class Singleton {
// static 记录唯一实例
private static Singleton uniqueInstance;
// 私有化构造方法,不让其他对象new创建单件实例
private Singleton(){}
// 提供获取uniqueInstance的入口
public static Singleton getUniqueInstance(){
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
使用时参建,又叫懒汉式,但不是线程安全的,后面细说。还有一种写法是饿汉式 ,实例被声明成 static 和 final 变量了,在第一次加载类到内存中时就会初始化。
public class Singleton{
//类加载时就初始化
private static final Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
饿汉式 的缺点是无法根据具体动态参数初始化单例,它在jvm加载类时马上创建了唯一实例。
双重检查加锁
public class Singleton {
// volatile 确保多线程正确处理uniqueInstance变量
private volatile static Singleton uniqueInstance;
// 私有化构造方法,不让其他对象new创建单件实例
private Singleton(){}
// 提供获取uniqueInstance的入口
public static Singleton getUniqueInstance(){
// 避免大量线程等待进入判断uniqueInstance是否已经创建
if (uniqueInstance == null){
// synchronized 保证线程安全
synchronized (Singleton.class){
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
静态内部类(Static Inner Class)单例
public class InnerClassSingleton {
private InnerClassSingleton() {}
private static class SingletonHolder {
private static final InnerClassSingleton instance = new InnerClassSingleton();
}
public static InnerClassSingleton getInstance() {
return SingletonHolder.instance;
}
}
静态内部类利用类加载的特性实现懒加载且线程安全
枚举
public enum EnumSingleton {
INSTANCE;
// 添加其他方法和属性
}
枚举则是最简洁的方式之一,由 Java 本身保证实例的唯一性。