常用设计模式

单例模式

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 时才加锁,避免了每次调用方法都加锁的性能开销。
相关推荐
岁岁种桃花儿7 小时前
CentOS7 彻底卸载所有JDK/JRE + 重新安装JDK8(实操完整版,解决kafka/jps报错)
java·开发语言·kafka
roman_日积跬步-终至千里7 小时前
【Java并发】Java 线程池实战:警惕使用CompletableFuture.supplyAsync
java·开发语言·网络
毕设源码-钟学长7 小时前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
CodeSheep程序羊8 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
我是咸鱼不闲呀8 小时前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
加油,小猿猿8 小时前
Java开发日志-双数据库事务问题
java·开发语言·数据库
yuluo_YX8 小时前
Reactive 编程 - Java Reactor
java·python·apache
山岚的运维笔记9 小时前
SQL Server笔记 -- 第20章:TRY/CATCH
java·数据库·笔记·sql·microsoft·sqlserver
南极企鹅9 小时前
springBoot项目有几个端口
java·spring boot·后端
清风拂山岗 明月照大江9 小时前
Redis笔记汇总
java·redis·缓存