在java中返回一个原子操作的int?

时间:2012-12-02 11:58:38

标签: java multithreading atomic

// is this atomic? 
public int size() {
    return count;
}

请注意,可以通过其他线程中的其他方法更改计数。

我知道整数读取和写入是原子的,但我不确定返回。

令我震惊的是,由于某种原因,ArrayBlockingQueue锁定了它的size()方法。

2 个答案:

答案 0 :(得分:13)

对原始int的读写是原子的,如您所知。返回基本上是读取并放置在内存中的其他位置。由于读数是原子的,因此不会出现竞争条件。您可以返回int的上一个或下一个值。

lock中使用ArrayBlockingQueue可能是由于可见性原因造成的。 count变量不是volatile所以如果在此期间修改了队列,没有某种锁定,则无法保证看到{{1}的最新值}。但由于读写是原子的,至少你永远不会看到最新的16位旧值和最新的16位新值。

答案 1 :(得分:0)

读取基元(long和double除外)是原子的。

但是假设有一个同步方法正在修改计数值;在这种情况下,您的阅读可能是或可能不是原子的。

 synchronized void changeCount(){
     //modifying value of count
 }

因此,在这种情况下,您还应将读取方法或最小声明计数同步为volatile。这将确保读取也是原子的,并返回正确的一致