常用设计模式

单例模式

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 时才加锁,避免了每次调用方法都加锁的性能开销。
相关推荐
一见4 分钟前
WorkBuddy安装Skill的方法
android·java·javascript
数据中穿行5 分钟前
迭代器设计模式全方位深度解析
设计模式
数据中穿行7 分钟前
观察者设计模式全方位深度解析
设计模式
悟空码字9 分钟前
SpringBoot + 腾讯地图实战:打造全能型地理位置服务平台,开箱即用!
java·spring boot·后端
小光学长11 分钟前
基于ssm的书法学习交流系统25ki07v1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·开发语言·数据库·学习·ssm
金智维科技官方12 分钟前
Agent架构综述:从Prompt到Context
java·微服务·架构·agent
@小明月17 分钟前
前端进阶之路
java·前端·笔记
不光头强20 分钟前
HashMap知识点
java·开发语言·哈希算法
顺风尿一寸24 分钟前
Spring事务回滚探秘:从@Transactional到数据库连接的完整旅程
java·后端
焦糖玛奇朵婷25 分钟前
盲盒小程序一站式开发
java·大数据·服务器·前端·小程序