什么场景下,使用 final、volatile、Atomic原子类、synchronized、J.U.C 包中的锁?
使用原则
满足使用条件的情况下,按先后顺序优先使用:final、volatile、Atomic原子类、synchronized、J.U.C 包中的锁
使用 final 的场景
final关键字的可见性是指:被final修饰的字段在构造器中一旦被初始化完成,并且构造器没有把“this”的引用传递出去(this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用访问到“初始化了一半”的对象),那么在其他线程中就能看见final字段的值,无须同步就能被其他线程正确访问。
使用 volatile 的场景
符合以下两条规则时,用volatile;
不符合以下两条规则时,使用 synchronized、java.util.concurrent 中的锁或原子类
由于volatile变量只能保证可见性,一般在什么时候才使用volatile关键字呢?
- 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
- 变量不需要与其他的状态变量共同参与不变约束。
在不符合以上两条规则的运算场景中,我们仍然要通过加锁(使用synchronized、java.util.concurrent中的锁或原子类)来保证原子性