请考虑以下情况。
某些类中有两个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()
的评估之间,其中一些变量是如此{ {1}}评估为equal
?或者通过比较调用变量的快照来原子地评估表达式?
提前致谢!
答案 0 :(得分:2)
你正确地假设。只有first.get()
和second.get()
是原子的,每个都是自己的。因此,在您已经调用first.get()
后,第二个值可能会发生变化。
您需要同步或以其他方式锁定first
和second
,以确保两者的原子性。
答案 1 :(得分:2)
变量可以在评估过程中改变值吗?
绝对。对first.get()
和second.get()
的调用是相互独立的。如果second
在first.get()
完成后但在second.get()
开始之前发生了变化,则会使用second
在评估其get()
时的值。< / p>
事实上,在您的方案中,first
和second
之间没有区别AtomicInteger
并且在int
比较中使用常规first == second
。< / p>