[英]Java boolean expression concurrency behavior
请考虑以下情况。 某个类中有两个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()
的求值之间,其中一些second.get()
发生了变化,因此equal
second.get()
false
吗? 还是通过比较调用变量的快照来原子地评估表达式?
提前致谢!
您假设正确。 只有first.get()
和second.get()
是原子的,每个原子都是自己的。 因此,在您调用first.get()
之后,second的值可以更改。
您将需要同步或以其他方式锁定first
和second
以确保两者之间的原子性。
变量可以在评估过程中更改值吗?
绝对。 对first.get()
和second.get()
的调用是彼此独立进行的。 如果second
在first.get()
完成之后但在second.get()
开始之前发生更改, first.get()
使用评估其get()
时的second
值。
实际上,在您的场景中, first
和second
是AtomicInteger
,在first == second
比较中使用常规int
并没有区别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.