在多线程并发中,除了加锁,使用cas,还可以使用不可变类直接避免多线程的并发修改,不可变对象,就是另一种避免竞争的方法。
不可变类的设计
final的使用
使用final修饰类以及类中的所有属性:
- 类要使用
final修饰,保证类中的方法不会被覆盖掉,防止子类在无意中破坏了不可变性 - 属性用
final修饰,保证该属性是只读的,不能被修改
保护性拷贝
在方法中,如果要对原来的对象进行修改,则返回一个新的对象。这种通过创建副本对象来避免共享的手段称之为保护性拷贝。
final的原理
final的原理是Java语言层面和JVM层面共同协作,通过编译时检查和运行时约束来保证被修饰目标的“不可变性”或“不可继承性”。
final修饰的变量在被写时,会在写后插入写屏障,使得不会指令重排并使得后续可见性。