2013-02-15 6 views
5

私はJavaのセマフォーに入っていて、この記事http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.htmlを読んでいました。私が得ることができない唯一の理由は、acquire()メソッドが同期化されたコンテキストで使用されない理由です。上記のwebisteからの例を見てみると:セマフォのacquire()メソッドを同期させる必要がないのはなぜですか?

彼らは、セマフォ作成:

private Semaphore semaphore = new Semaphore(100); 

をし、ちょうどこのような許可証を取得:それは可能であることではないでしょう、今

semaphore.acquire(); 

を2または複数のスレッドが同時に()を取得しようとしていますか?もしそうなら、カウントに少し問題があります。

または、セマフォ自体が同期を処理していますか?

答えて

3

また、セマフォ自体が同期を処理していますか?

はい、基本的にはそれです。 the javadocで説明したようにセマフォは、スレッドセーフです:

メモリー整合性効果:以前、このようなリリースとして「解放」メソッドを呼び出すスレッド内のアクション()が起こる-前に、このような取得などに成功し、「取得」メソッドを次のアクション()を別のスレッドで使用します。

java.util.concurrentパッケージのオブジェクトに対するほとんどの操作はスレッドセーフです。詳細は、package javadocの一番下にあります。

3

セマフォは高速である必要があります。したがって、Unsafeクラスの原子並行処理プリミティブ(CAS (compare and swap)など)を使用する必要があります。

これらのプリミティブでは、同期ははるかに低いレベルで行われ、モニターは不要です。 (ロックフリー同期)。

実際に、期待値が書き込み/読み取り値に等しくなるまで、CASを使用して連続的にループが同期を実行します。

0

同期は

がここjavadoc

を参照してくださいCAS操作とAbstractQueuedSynchronizerによって保証されています
関連する問題