线程安全的单例模式

  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 实例。

相关推荐
Determined_man几秒前
黑马点评,后端请求没问题,前端页面有时候请求超时,无响应数据?
java·后端
山山而川粤2 分钟前
SSM考研信息查询系统
java·大数据·运维·服务器·开发语言·数据库·考研
计算机-秋大田3 分钟前
基于Spring Boot的轻型卡车零部件销售平台的设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·课程设计
一介输生6 分钟前
java后端图片验证码实现
java
半个脑袋儿7 分钟前
FastJSON序列化扩展接口与特性详解
java
Dcs7 分钟前
Python 自动化:节省时间,更智能地工作
java
Tony889 分钟前
Java中的StringBuilder支持排序吗?支持头部插入吗?
java
程序员 小柴23 分钟前
RabbitMQ死信队列
java·rabbitmq·java-rabbitmq
小赖同学吖24 分钟前
Java 中的继承与多态:面向对象编程的核心特性
java·开发语言
萧鼎30 分钟前
Python WebSockets 库详解:从基础到实战
开发语言·python