// is this atomic?
public int size() {
return count;
}
count は、他のスレッドの他のメソッドによって変更できることに注意してください。
整数の読み取りと書き込みがアトミックであることは知っていますが、戻り値についてはわかりません。
私が驚いたのは、何らかの理由でArrayBlockingQueueが size() メソッドをロックしていることです。
// is this atomic?
public int size() {
return count;
}
count は、他のスレッドの他のメソッドによって変更できることに注意してください。
整数の読み取りと書き込みがアトミックであることは知っていますが、戻り値についてはわかりません。
私が驚いたのは、何らかの理由でArrayBlockingQueueが size() メソッドをロックしていることです。
int
ご存じのように、プリミティブへの読み取りと書き込みはアトミックです。戻るとは、基本的には、メモリ内の別の場所を読み取って配置することです。読み取りはアトミックであるため、競合状態は発生しません。の前または次の値を返しますint
。
lock
in の使用は、ArrayBlockingQueue
可視性の理由による可能性があります。count
その間にキューが変更された場合、変数はvolatile
そうではありません。何らかのロックがなければ、 の最新の値が表示される保証はありませんcount
。しかし、読み取りと書き込みはアトミックであるため、少なくとも、古い値の最も若い 16 ビットと新しい値の最も古い 16 ビットが表示されることはありません。
プリミティブ ( long と double を除く) の読み取りはアトミックです。
しかし、count の値を変更する同期メソッドがあるとします。そのような場合、読み取りはアトミックである場合とそうでない場合があります。
synchronized void changeCount(){
//modifying value of count
}
したがって、その場合は、読み取りメソッドまたは最小宣言数も揮発性として同期する必要があります。これにより、読み取りもアトミックになり、正しい一貫した値が返されます。