线程安全的单例模式

  1. 使用 synchronized 修饰 getInstance 方法

确保了只有一个线程可以同时访问 getInstance 方法。这意味着在任何时候只有一个线程可以执行 getInstance() 方法,从而避免了多个线程同时创建多个实例的情况,因此是线程安全的。

java 复制代码
public class ClientUtil {
    private static ClientUtil clientUtil;

    private ClientUtil() {}

    public static synchronized ClientUtil getInstance() {
        if (null == clientUtil) {
            clientUtil = new ClientUtil();
            clientMap = new HashMap<String, ApiClient>();
        }
        return clientUtil;
    }
}

但是,这种实现方式会在每次调用 getInstance() 方法时都获取锁,这可能会影响性能,尤其是在高并发的情况下。因为只有一个线程可以访问该方法,其他线程必须等待当前线程释放锁才能继续执行。

  1. 使用双重检查锁定(Double-Checked Locking)机制 优化性能

核心思想是在首次检查对象是否为 null 时进行同步,以确保只有一个线程可以创建对象,而后续的检查则不需要同步,以提高性能。

java 复制代码
public class ThreadSafeSingleton {

    // 私有静态变量,存储单例实例
    private static volatile ThreadSafeSingleton instance;

    // 私有构造函数,防止外部实例化
    private ThreadSafeSingleton() {}

    // 公有静态方法,获取单例实例
    public static ThreadSafeSingleton getInstance() {
        // 双重检查锁定,确保只有一个线程创建实例
        if (instance == null) {
            synchronized (ThreadSafeSingleton.class) {
                // 再次检查实例是否已经被创建
                if (instance == null) {
                    instance = new ThreadSafeSingleton();
                }
            }
        }
        return instance;
    }

    // 其他业务方法
    public void doSomething() {
        System.out.println("Singleton instance is doing something.");
    }
}

instance 变量使用了 volatile 关键字,确保多线程环境下对它的读取和写入操作都是原子的,并且对所有线程可见。

构造函数 ThreadSafeSingleton() 被声明为私有,确保外部无法直接实例化 ThreadSafeSingleton。

getInstance() 方法使用了双重检查锁定机制,在多线程环境下保证了只有一个线程创建实例。首先检查 instance 是否为 null,如果为 null,则进入同步块,再次检查 instance 是否为 null,如果仍然为 null,则创建一个新的 ThreadSafeSingleton 实例。

相关推荐
降临-max几秒前
JavaWeb企业级开发---Ajax、
java·ajax·maven
NMBG22几秒前
外卖综合项目
java·前端·spring boot
清水白石0083 分钟前
《用 Python 单例模式打造稳定高效的数据库连接管理器》
数据库·python·单例模式
小徐Chao努力5 分钟前
Spring AI Alibaba A2A 使用指南
java·人工智能·spring boot·spring·spring cloud·agent·a2a
梅孔立12 分钟前
【实用教程】python 批量解析 EML 邮件文件 存成txt ,可以利用 AI 辅助快速生成年终总结
开发语言·python
rannn_11114 分钟前
【Git教程】概述、常用命令、Git-IDEA集成
java·git·后端·intellij-idea
我家领养了个白胖胖15 分钟前
向量化和向量数据库redisstack使用
java·后端·ai编程
c#上位机23 分钟前
C#异步编程之async、await
开发语言·c#
苹果醋325 分钟前
Java设计模式实战:从面向对象原则到架构设计的最佳实践
java·运维·spring boot·mysql·nginx
郑州光合科技余经理35 分钟前
实战分享:如何构建东南亚高并发跑腿配送系统
java·开发语言·javascript·spring cloud·uni-app·c#·php