不可变类

2 阅读1分钟

在多线程并发中,除了加锁,使用cas,还可以使用不可变类直接避免多线程的并发修改,不可变对象,就是另一种避免竞争的方法。

不可变类的设计

final的使用

使用final修饰类以及类中的所有属性:

  1. 类要使用final修饰,保证类中的方法不会被覆盖掉,防止子类在无意中破坏了不可变性
  2. 属性用final修饰,保证该属性是只读的,不能被修改

保护性拷贝

在方法中,如果要对原来的对象进行修改,则返回一个新的对象。这种通过创建副本对象来避免共享的手段称之为保护性拷贝

final的原理

final的原理是Java语言层面和JVM层面共同协作,通过编译时检查运行时约束来保证被修饰目标的“不可变性”或“不可继承性”。

final修饰的变量在被写时,会在写后插入写屏障,使得不会指令重排并使得后续可见性。