Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回int在java中是原子操作吗?_Java_Multithreading_Atomic - Fatal编程技术网

返回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
可能会递增。您是否声明了count
volatile
?+1以说明可见性,这里最重要的一点是注意,只要字段没有声明为volatile,long和double的读写就不是原子的。当然,最新的值不能相信我没有想到。明显的原因是什么?@Raffaele:简单地说,有时当一个线程修改变量时,这种更改不会立即(或永远)发生其他线程可见。见:
 synchronized void changeCount(){
     //modifying value of count
 }