【单例模式】

发布于:2025-05-17 ⋅ 阅读:(22) ⋅ 点赞:(0)
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类只有一个实例,并提供了线程安全的访问方式。以下是关键点的解析:

  1. 类结构
    a、public final class SingletonManager
    final修饰符防止类被继承,保证单例的不可扩展性。

    b、private volatile static SingletonManager sSingletonManager
    volatile确保多线程环境下的可见性,并禁止指令重排序,避免未完全初始化的对象被其他线程访问。

  2. 私有构造方法
    构造方法私有化,阻止外部通过new创建实例,强制通过getInstance()获取单例。

private SingletonManager() {}
  1. 双重检查锁定(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;
}
  1. 线程安全性
    a、volatile的作用
    解决双重检查锁定中的指令重排序问题。在Java 5+中,volatile确保写操作(对象初始化)在读操作之前完成。

    b、延迟初始化(Lazy Initialization)
    实例在首次调用getInstance()时创建,避免类加载时立即初始化(饿汉式单例的资源浪费问题)。


网站公告

今日签到

点亮在社区的每一天
去签到