2つの異なるスレッド間でLinkedBlockingQueue
を使用しています。 1つのスレッドはadd
を介してデータを追加し、もう1つのスレッドはtake
を介してデータを受信します。
私の質問は、add
とtake
へのアクセスを同期する必要がありますか。 LinkedBlockingQueue
の挿入および削除メソッドはスレッドセーフですか?
はい。 ドキュメント から:
「BlockingQueue実装はスレッドセーフです。すべてのキューイングメソッドは、内部ロックまたは他の形式の同時実行制御を使用してアトミックに効果を達成します。そのため、たとえば、cの一部の要素のみを追加した後にaddAll(c)が失敗(例外をスロー)する可能性があります。」
はい、BlockingQueue
メソッドadd()
およびtake()
はスレッドセーフですただし違いがあります。
add ()
およびtake()
メソッドは、2つの異なるReentrantLock
オブジェクトを使用します。
_add(
_)メソッドは
_private final ReentrantLock putLock = new ReentrantLock();
_
take()
メソッドは
_private final ReentrantLock takeLock = new ReentrantLock();
_
したがって、add()
メソッドへの同時アクセスは同期されます。同様に、take()
メソッドへの同時アクセスはsynchronized
です。
ただし、add()
およびtake()
メソッドへの同時アクセスはsynchronized
ではありません。これらは2つの異なるロックオブジェクトを使用しているためです(キューがいっぱいのEdge条件中を除く/空)。
単にはい、それは間違いなくスレッドセーフです。そうでなければ、ThreadPoolExecutorの要素を格納するための候補としては資格がありません。
BlockingQueueの同時実行性を心配することなく、要素を追加および取得するだけです。