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();
所以问题是这个表达式是如何求值的?变量可以在评估期间更改值吗?例如,当我们开始计算表达式时,first
和 second
变量是否可能相等,但在计算 first.get()
和 second.get()
之间,其中一些变量发生变化,因此 equal
计算结果为 false
?或者通过比较调用时变量的快照来自动计算表达式?
提前致谢!
您的假设是正确的。只有 first.get()
和 second.get()
是原子的,每个都是独立的。因此,在您调用 first.get()
.
之后,second 的值可能会发生变化
您需要同步或以其他方式锁定 first
和 second
以确保两者的原子性。
Can variables change values during its evaluation?
当然可以。对 first.get()
和 second.get()
的调用是相互独立的。如果 second
在 first.get()
完成后但在 second.get()
开始之前更改,则将使用 second
评估其 get()
时的值。
事实上,在您的场景中,first
和 second
是 AtomicInteger
和在 first == second
比较中使用常规 int
没有区别.
请考虑以下情况。 一些 class:
中有两个AtomicInteger
字段
private final AtomicInteger first = new AtomicInteger();
private final AtomicInteger second = new AtomicInteger();
然后我有这样的东西:
boolean equal = first.get() == second.get();
所以问题是这个表达式是如何求值的?变量可以在评估期间更改值吗?例如,当我们开始计算表达式时,first
和 second
变量是否可能相等,但在计算 first.get()
和 second.get()
之间,其中一些变量发生变化,因此 equal
计算结果为 false
?或者通过比较调用时变量的快照来自动计算表达式?
提前致谢!
您的假设是正确的。只有 first.get()
和 second.get()
是原子的,每个都是独立的。因此,在您调用 first.get()
.
您需要同步或以其他方式锁定 first
和 second
以确保两者的原子性。
Can variables change values during its evaluation?
当然可以。对 first.get()
和 second.get()
的调用是相互独立的。如果 second
在 first.get()
完成后但在 second.get()
开始之前更改,则将使用 second
评估其 get()
时的值。
事实上,在您的场景中,first
和 second
是 AtomicInteger
和在 first == second
比较中使用常规 int
没有区别.