返回int在java中是原子操作吗?
请注意,计数可以通过其他线程中的其他方法更改 我知道整数读取和写入是原子的,但我不确定返回值返回int在java中是原子操作吗?,java,multithreading,atomic,Java,Multithreading,Atomic,请注意,计数可以通过其他线程中的其他方法更改 我知道整数读取和写入是原子的,但我不确定返回值 让我吃惊的是,出于某种原因,它锁定了size()方法。对原语int的读写是原子的,正如您所知。返回基本上是读取并放置在内存中的其他位置。因为读取是原子的,所以不会发生竞争条件。您可以返回int的上一个或下一个值 在ArrayBlockingQueue中使用lock可能是由于可见性原因count变量不是易变的,因此,如果同时修改了队列,而没有某种锁定,则不能保证看到count的最新值。但由于读写是原子的,
让我吃惊的是,出于某种原因,它锁定了size()方法。对原语
int
的读写是原子的,正如您所知。返回基本上是读取并放置在内存中的其他位置。因为读取是原子的,所以不会发生竞争条件。您可以返回int
的上一个或下一个值
在ArrayBlockingQueue
中使用lock
可能是由于可见性原因count
变量不是易变的,因此,如果同时修改了队列,而没有某种锁定,则不能保证看到count
的最新值。但由于读写是原子的,至少你永远不会看到最年轻的16位旧值和最老的16位新值。读取原语(长和双精度除外)是原子的
但假设有一个同步的方法修改count的值;在这种情况下,您的读取可能是原子的,也可能不是原子的
// is this atomic?
public int size() {
return count;
}
因此,在这种情况下,您还应该将读取方法或最小声明计数同步为volatile。这将确保读取也是原子的,并且返回正确且一致的值虽然我无法回答您的问题,但我相信返回值实际上是值的副本。如果读/写本身是原子的,则返回值是完全安全的,因为它将值“读取”到副本缓冲区并返回该副本。整数增量不是原子的,并且在另一个线程中,
count
可能会递增。您是否声明了countvolatile
?+1以说明可见性,这里最重要的一点是注意,只要字段没有声明为volatile,long和double的读写就不是原子的。当然,最新的值不能相信我没有想到。明显的原因是什么?@Raffaele:简单地说,有时当一个线程修改变量时,这种更改不会立即(或永远)发生其他线程可见。见:
synchronized void changeCount(){
//modifying value of count
}