Java不可变类的特性
- 状态不可改变:一旦创建,其内部状态(成员变量)就不能再被修改。所有成员变量通常被声明为
final
,确保它们在对象初始化后不能被重新赋值。
- 对象创建后哈希值不变:由于对象状态不可变,其哈希值在创建后也不会改变,这使得不可变类非常适合作为
HashMap
的键。
- 线程安全:无需额外的同步机制即可在多线程环境下安全使用。
确保多线程环境下线程安全性的方式
- 避免共享可变状态:不可变类没有可变的状态,所有线程访问的都是同一个不可变对象,不存在数据竞争问题。因为没有可变数据,就不会出现一个线程修改数据,另一个线程读到不一致数据的情况。
- 对象创建时的安全发布:由于对象一旦创建就不可变,在创建过程中就可以确保对象的状态是正确初始化的,并且创建后状态不会改变,所以可以安全地发布给多个线程使用。
简单不可变类示例及线程安全原理
public final class ImmutableClass {
private final int value;
public ImmutableClass(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
- 线程安全原理:
ImmutableClass
类被声明为final
,防止被继承,避免子类改变其行为。
value
成员变量被声明为final
,一旦初始化就不能再被修改。
- 没有提供修改
value
的方法,只有获取value
的getValue
方法。因此,多个线程访问ImmutableClass
对象时,只能读取value
的值,不会出现数据竞争,从而保证了线程安全性。