什么场景下,使用 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关键字呢?

  1. 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
  2. 变量不需要与其他的状态变量共同参与不变约束。

在不符合以上两条规则的运算场景中,我们仍然要通过加锁(使用synchronized、java.util.concurrent中的锁或原子类)来保证原子性

posted on 2020-03-05 11:33  cag2050  阅读(338)  评论(0编辑  收藏  举报

导航