// is this atomic?
public int size() {
return count;
}
请注意,可以通过其他线程中的其他方法更改计数。
我知道整数读取和写入是原子的,但我不确定返回。
令我震惊的是,由于某种原因,ArrayBlockingQueue锁定了它的size()方法。
答案 0 :(得分:13)
对原始int
的读写是原子的,如您所知。返回基本上是读取并放置在内存中的其他位置。由于读数是原子的,因此不会出现竞争条件。您可以返回int
的上一个或下一个值。
在lock
中使用ArrayBlockingQueue
可能是由于可见性原因造成的。 count
变量不是volatile
所以如果在此期间修改了队列,没有某种锁定,则无法保证看到{{1}的最新值}。但由于读写是原子的,至少你永远不会看到最新的16位旧值和最新的16位新值。
答案 1 :(得分:0)
读取基元(long和double除外)是原子的。
但是假设有一个同步方法正在修改计数值;在这种情况下,您的阅读可能是或可能不是原子的。
synchronized void changeCount(){
//modifying value of count
}
因此,在这种情况下,您还应将读取方法或最小声明计数同步为volatile。这将确保读取也是原子的,并返回正确的一致值