- 不可变类的使用
- 不可变类的设计
- 无状态类设计
问题提出
有些类是线程不安全的,即当多个线程访问该类同一个对象时,调用方法可能会产生线程不安全问题。
例如SmipleDateFormat类,其中的parse方法即无法保证线程安全。
改进方法即可以调用方法时加锁,或者改为不可变类,不可变类能够保证其中的每个方法都是线程安全的。
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.Date;
public class TestFixed {
public static void main(String[] args) {
DateTimeFormatter stf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
for (int i=0;i<10;i++){
new Thread(()->{
TemporalAccessor parse = stf.parse("2013-02-21");
System.out.println(parse);
}).start();
}
}
}
注意:
不可变类可以保证其中每个方法是线程安全的,但是不能够保证方法的组合是线程安全的,方法本质还是指令的组合,比如之前给BigDecimal类加AotmicReference的例子中,BigDecimal实际上是不可变类,但是当涉及对共享变量读取的时候,出现了如下的方法组合: