Java 布尔表达式并发行为



请考虑以下情况。某些类中有两个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.get()开始之前更改second,则将使用截至评估其get()时的second值。

事实上,在您的方案中,firstsecond AtomicInteger s 与在first == second比较中使用常规 int s 之间没有区别。

你假设正确。只有first.get()second.get()是原子的,每个都是独立的。因此,秒的值可以在您调用 first.get() 后更改。

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

最新更新