请考虑以下情况。某些类中有两个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
值。
事实上,在您的方案中,first
和 second
AtomicInteger
s 与在first == second
比较中使用常规 int
s 之间没有区别。
你假设正确。只有first.get()
和second.get()
是原子的,每个都是独立的。因此,秒的值可以在您调用 first.get()
后更改。
您需要同步或以其他方式锁定first
和second
,以确保两者之间的原子性。