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

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

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

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

4

2 回答 2

13

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

使用lockinArrayBlockingQueue可能是由于可见性原因。count如果在此期间修改了队列,则变量不是volatile这样,如果没有某种锁定,则不能保证看到. count但是由于读写是原子的,至少你永远不会看到最年轻的 16 位旧值和最旧的 16 位新值。

于 2012-12-02T12:00:31.293 回答
0

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

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

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

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

于 2012-12-02T12:20:28.190 回答