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