acquire ()
メソッドとrelease ()
( java.util.concurrent.Semaphore
) とawait ()
との違いを知っている人はいますかsignal (new ReentrantLock().newCondition() )
。
これらの各メソッドの疑似コードを公開できますか?
acquire ()
メソッドとrelease ()
( java.util.concurrent.Semaphore
) とawait ()
との違いを知っている人はいますかsignal (new ReentrantLock().newCondition() )
。
これらの各メソッドの疑似コードを公開できますか?
表面的には、これらのメソッドの動作は似ているように見えるかもしれません。状況によってはスレッドをブロックしたり、状況によってacquire()/await()
はスレッドのブロックを解除したりrelease()/signal()
できます。ただし、セマフォと条件は異なる目的を果たします。
java.util.concurrent.Semaphore
一般的な開発者による使用を目的とした、比較的高レベルの同期メカニズムです。通常、リソースにアクセスする前に各リクエスタスレッド呼び出しを行うことにより、リソースへの同時アクセスを制限するために使用しますacquire()
(セマフォ許可が利用できない場合は、スレッドブロックを作成します)。javadoc からの説明:
概念的には、セマフォは一連の許可を維持します。それぞれの acquire() は、必要に応じて許可が利用可能になるまでブロックし、それを取得します。各 release() は許可を追加し、ブロックしている取得者を解放する可能性があります。
java.util.concurrent.locks.Condition
基本的に提供される機能を拡張する比較的低レベルの同期メカニズムであり、java.lang.Object
メソッドおよび. ある条件が真になるのを待機する必要がある場合に (通常は他のスレッドのアクティビティによって) スレッドがそのアクティビティを一時停止できるようにし、状態変数が取得されたときに他のスレッドが待機中のスレッドを「ウェイクアップ」できるようにします。状態の一部が変更されている場合があります。通常、正しく使用するのは難しく、一般的な開発者は、パッケージ java.util.concurrent の上位レベルのメカニズム (セマフォなど) を使用することをお勧めします。wait()
notify()
notifyAll()
これに関するより詳細な情報は、Brian Goetz による優れた本「Java Concurrency in Practice」に記載されています。