Java 布尔表达式并发行为

Java boolean expression concurrency behavior

请考虑以下情况。 一些 class:

中有两个 AtomicInteger 字段
private final AtomicInteger first = new AtomicInteger();
private final AtomicInteger second = new AtomicInteger();

然后我有这样的东西:

boolean equal = first.get() == second.get();

所以问题是这个表达式是如何求值的?变量可以在评估期间更改值吗?例如,当我们开始计算表达式时,firstsecond 变量是否可能相等,但在计算 first.get()second.get() 之间,其中一些变量发生变化,因此 equal 计算结果为 false?或者通过比较调用时变量的快照来自动计算表达式?

提前致谢!

您的假设是正确的。只有 first.get()second.get() 是原子的,每个都是独立的。因此,在您调用 first.get().

之后,second 的值可能会发生变化

您需要同步或以其他方式锁定 firstsecond 以确保两者的原子性。

Can variables change values during its evaluation?

当然可以。对 first.get()second.get() 的调用是相互独立的。如果 secondfirst.get() 完成后但在 second.get() 开始之前更改,则将使用 second 评估其 get() 时的值。

事实上,在您的场景中,firstsecondAtomicInteger 和在 first == second 比较中使用常规 int 没有区别.