Java布尔表达式并发行为

时间:2018-01-09 14:00:40

标签: java multithreading concurrency atomicity

请考虑以下情况。 某些类中有两个AtomicInteger字段:

private final AtomicInteger first = new AtomicInteger();
private final AtomicInteger second = new AtomicInteger();

然后我有这样的事情:

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

所以问题是这个表达式究竟是如何评估的?变量可以在评估期间改变值吗?例如,当我们开始评估表达式时,firstsecond变量都可能相等,但在first.get()second.get()的评估之间,其中一些变量是如此{ {1}}评估为equal?或者通过比较调用变量的快照来原子地评估表达式?

提前致谢!

2 个答案:

答案 0 :(得分:2)

你正确地假设。只有first.get()second.get()是原子的,每个都是自己的。因此,在您已经调用first.get()后,第二个值可能会发生变化。

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

答案 1 :(得分:2)

  

变量可以在评估过程中改变值吗?

绝对。对first.get()second.get()的调用是相互独立的。如果secondfirst.get()完成后但在second.get()开始之前发生了变化,则会使用second在评估其get()时的值。< / p>

事实上,在您的方案中,firstsecond之间没有区别AtomicInteger并且在int比较中使用常规first == second。< / p>