public final class SingletonManager {
private volatile static SingletonManager sSingletonManager;
private SingletonManager(){
}
public static SingletonManager getInstance() {
if (null == sSingletonManager) {
synchronized (SingletonManager.class) {
if (null == sSingletonManager) {
sSingletonManager = new SingletonManager();
}
}
}
return sSingletonManager;
}
}
这段Java代码实现了一个单例模式,确保在整个应用程序中SingletonManager类只有一个实例,并提供了线程安全的访问方式。以下是关键点的解析:
类结构
a、public final class SingletonManager
final修饰符防止类被继承,保证单例的不可扩展性。b、private volatile static SingletonManager sSingletonManager
volatile确保多线程环境下的可见性,并禁止指令重排序,避免未完全初始化的对象被其他线程访问。私有构造方法
构造方法私有化,阻止外部通过new创建实例,强制通过getInstance()获取单例。
private SingletonManager() {}
双重检查锁定(Double-Checked Locking)
a、第一次检查(无锁)
快速判断实例是否已存在,避免不必要的同步开销。b、同步块
锁定SingletonManager.class,确保同一时间只有一个线程进入临界区。c、第二次检查(有锁)
防止多个线程通过第一次检查后,依次进入同步块重复创建实例。
public static SingletonManager getInstance() {
if (null == sSingletonManager) { // 第一次检查(无锁)
synchronized (SingletonManager.class) { // 加锁
if (null == sSingletonManager) { // 第二次检查(有锁)
sSingletonManager = new SingletonManager();
}
}
}
return sSingletonManager;
}
线程安全性
a、volatile的作用
解决双重检查锁定中的指令重排序问题。在Java 5+中,volatile确保写操作(对象初始化)在读操作之前完成。b、延迟初始化(Lazy Initialization)
实例在首次调用getInstance()时创建,避免类加载时立即初始化(饿汉式单例的资源浪费问题)。