谦逊不值得可耻,放荡才是。
Humility is not worthy of shame, debauchery is.
Java单例模式
单例模式是一种常见的设计模式,用于确保某个类只有一个实例,并提供一个全局访问点。
懒汉模式 vs 饿汉模式
懒汉模式
- 懒汉模式:在需要时才创建实例,具有延迟加载的特性,类加载速度快,但运行时获取对象的速度较慢。 (时间换空间)
- 线程不安全:懒汉模式在多线程环境下存在线程安全问题,可能会创建多个实例。
饿汉模式
- 饿汉模式:在类加载时就完成初始化工作,因此获取对象的速度较快,但不具备延迟加载的特性。(空间换时间)
- 线程安全:饿汉模式通常是线程安全的,因为实例在类加载时已经创建好。
实现单例模式的三个要素
- 构造函数私有化:防止外部直接实例化对象。
- 自己提供自己的实例:在类内部创建私有静态实例。
- 外部提供公有的访问方法:通过公有的静态方法返回实例。
示例代码
饿汉模式
java
public class Config1 {
// 构造函数私有化
private Config1() { }
// 自己提供自己的实例 -- 饿汉模式
private static Config1 config1 = new Config1();
// 外部提供一个公有的访问方法
public static Config1 getInstance() {
return config1;
}
}
懒汉模式
java
public class Config2 {
// 构造函数私有化
private Config2() { }
// 使用volatile关键字保证多线程环境下的可见性
private static volatile Config2 config2;
// 外部提供一个公有的访问方法,双重检查锁定保证线程安全
public static Config2 getInstance() {
if (config2 == null) {
synchronized (Config2.class) {
if (config2 == null) {
config2 = new Config2();
}
}
}
return config2;
}
}
在上述示例中,Config1
类采用了饿汉模式实现单例模式,而Config2
类采用了懒汉模式实现单例模式。懒汉模式中使用了双重检查锁定来保证线程安全性,同时使用volatile
关键字保证多线程环境下的可见性。
单例模式在实际开发中经常用于管理全局资源、配置信息等,但在多线程环境下需要谨慎处理,以确保线程安全性。