常用设计模式

单例模式

1. 双重检查

java 复制代码
public class Singleton {

    // 使用 volatile 修饰,防止指令重排序
    private static volatile Singleton instance;

    // 私有化构造方法,防止外部直接实例化
    private Singleton() {}

    // 提供全局访问点
    public static Singleton getInstance() {
        if (instance == null) { // 第一次检查
            synchronized (Singleton.class) {
                if (instance == null) { // 第二次检查
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

代码解析

  1. volatile 关键字:
  • 防止指令重排序。
  • 在没有 volatile 修饰时,instance = new Singleton(); 可能会分为以下三个步骤:
    • 分配内存。
    • 初始化对象。
    • 将内存地址赋值给 instance。
  • 如果重排序发生(步骤 2 和步骤 3 调换顺序),可能会导致其他线程获取到未完全初始化的对象。
  1. 双重检查锁的意义:
    • 第一次检查:避免不必要的加锁操作,提高性能。
    • 第二次检查:确保线程安全,防止多个线程同时进入同步块导致重复实例化。
  2. 私有构造方法:
    • 防止外部直接调用构造器创建实例。
  3. 线程安全性:
    • 使用 synchronized 确保线程安全。

优点

  • 线程安全:在多线程环境下可以安全使用。
  • 性能高:通过双重检查锁机制,只有在 instance 为 null 时才加锁,避免了每次调用方法都加锁的性能开销。
相关推荐
计算机安禾2 分钟前
【算法设计与分析】第29篇:启发式与元启发式搜索方法综述
java·数据库·算法
DIY源码阁3 分钟前
JavaSwing学生选课系统 - MySQL版
java·数据库·mysql·eclipse
砍材农夫7 分钟前
物联网实战:Spring Boot + Netty 搭建 MQTT | MQTT 设备模拟器
java·spring boot·后端·物联网·struts·spring·netty
城管不管11 分钟前
Agent——001
android·java·数据库·llm·prompt
AC赳赳老秦12 分钟前
OpenClaw批量任务队列优化:解决任务堆积、执行缓慢、优先级混乱问题
java·大数据·数据库·c++·自动化·php·openclaw
Pluchon17 分钟前
萌萌技术分享笔记——Java综合项目
java·开发语言·笔记·git·github·mybatis·postman
TDengine (老段)21 分钟前
TDengine Compaction 合并策略 — STT 整理、文件合并与后台调度
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
J2虾虾25 分钟前
Spring AI Alibaba - 多智能体(Multi-agent)
java·人工智能·spring
方也_arkling31 分钟前
【Java-Day13】内部类
java·开发语言
用户2986985301432 分钟前
Java 开发中读取与解析 Word 文档的实践记录
java·后端