什么场景下,使用 final、volatile、Atomic、synchronized?

使用原则

按先后顺序优先使用:final、volatile、Atomic原子类、synchronized、J.U.C 包中的锁

使用 final 的场景

final关键字的可见性是指:被final修饰的字段在构造器中一旦被初始化完成,并且构造器没有把“this”的引用传递出去(this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用访问到“初始化了一半”的对象),那么在其他线程中就能看见final字段的值,无须同步就能被其他线程正确访问。

使用 volatile 的场景

由于volatile变量只能保证可见性,在不符合以下两条规则的运算场景中,我们仍然要通过加锁(使用synchronized、java.util.concurrent中的锁或原子类)来保证原子性:

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

猜你喜欢

转载自www.cnblogs.com/cag2050/p/12419220.html