线程安全的不可变类通过“不可变性”天然保证线程安全,核心是所有字段声明为private final、无setter、构造器完成初始化且不逸出this、对可变组件做防御性拷贝、类或方法声明为final、构造过程避免调用可重写方法或发布未完成对象。

设计线程安全的不可变类,核心是“不可变性”本身就能保证线程安全——只要对象一旦创建后状态无法被修改,多个线程并发读取就无需同步。
确保所有字段都是 final 且私有
final 关键字阻止字段被重新赋值,配合 private 修饰符防止外部直接访问或子类篡改。
- 所有实例字段声明为 private final
- 不提供任何 setter 方法或能修改内部状态的 public 方法
- 构造器中完成全部字段初始化,且不暴露 this 引用(避免逸出)
防御性拷贝可变组件
如果类包含可变对象(如 Date、ArrayList、StringBuilder),不能直接保存其引用,否则外部仍可通过该引用修改内部状态。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 构造器中对传入的可变参数做深拷贝(如 new ArrayList(list)、new Date(date.getTime()))
- getter 方法返回可变字段的副本,而非原始引用(如 return new ArrayList(this.items))
- 对于数组,用 Arrays.copyOf() 或手动克隆,避免返回原始数组引用
禁止子类破坏不可变性
若允许继承,子类可能通过重写方法或添加可变字段绕过约束。
- 将类声明为 final(最简单可靠的方式)
- 或至少将所有方法设为 final,但不如类 final 彻底
注意构造过程的安全性
避免在构造器中调用可被重写的方法,或发布未构造完成的对象引用(如注册监听器、启动线程、写入静态集合等)。
- 构造器内只做字段赋值和必要校验
- 不调用非 private / 非 final 的实例方法
- 不将 this 传递给其他类或线程
不可变类天然线程安全,不需要 synchronized 或 volatile。典型例子:String、LocalDateTime、BigInteger。设计时牢记一点:状态一旦确立,就永远不变。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










