- 单例模式
- 采取一定的方法保证在整个程序运行期间,某个类只存在一个实例对象。
- 该类提供一个可以获取实例对象的静态方法
1. 饿汉式
public class Singleton1 {
// 私有的静态对象
private static final Singleton1 instance = new Singleton1();
// 提供一个静态方法获取实例
public static Singleton1 getInstance() {
return instance;
}
private Singleton1 () {
// 私有化构造方法
}
}
- 使用静态代码块
- 利用静态代码块只会随着类加载执行一次
public class Singleton2 {
private static final Singleton2 instance;
static {
instance = new Singleton2();
}
/// 公共方法
public static Singleton2 getInstance() {
return instance;
}
private Singleton2 (){}
}
特点:线程安全,可能造成内存浪费
2. 懒汉式
public class Singleton3 {
private static volatile Singleton3 instance;
public static Singleton3 getInstance() {
if (instance == null) {
synchronized (Singleton3.class) {
if (instance == null) {
instance = new Singleton3();
}
}
}
return instance;
}
private Singleton3() {}
}
- 使用静态代码块
public class Singleton4 {
/// 静态内部类
private static class Singleton {
private static final Singleton4 INSTANCE = new Singleton4();
}
/// 私有构造
private Singleton4() {
}
/// 公共获取方法
public static Singleton4 getInstance() {
return Singleton.INSTANCE;
}
}
线程安全,延迟加载
- 枚举使用单例
public enum Singleton5 {
INSTANCE;
public void func() {
System.out.println("调用方法");
}
}
- 依赖JVM 的类加载机制来保证线程安全和单例性。
- 不会有同步和锁的开销,比双重检查效率更高。