• 不可变类的使用
  • 不可变类的设计
  • 无状态类设计

问题提出

有些类是线程不安全的,即当多个线程访问该类同一个对象时,调用方法可能会产生线程不安全问题。
例如SmipleDateFormat类,其中的parse方法即无法保证线程安全。
改进方法即可以调用方法时加锁,或者改为不可变类,不可变类能够保证其中的每个方法都是线程安全的。

  1. import java.time.format.DateTimeFormatter;
  2. import java.time.temporal.TemporalAccessor;
  3. import java.util.Date;
  4. public class TestFixed {
  5. public static void main(String[] args) {
  6. DateTimeFormatter stf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  7. for (int i=0;i<10;i++){
  8. new Thread(()->{
  9. TemporalAccessor parse = stf.parse("2013-02-21");
  10. System.out.println(parse);
  11. }).start();
  12. }
  13. }
  14. }

注意:

不可变类可以保证其中每个方法是线程安全的,但是不能够保证方法的组合是线程安全的,方法本质还是指令的组合,比如之前给BigDecimal类加AotmicReference的例子中,BigDecimal实际上是不可变类,但是当涉及对共享变量读取的时候,出现了如下的方法组合: