8

私はJavaでセマフォを使い始めており、この記事http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.htmlを読んでいました。私が得られない唯一のことは、acquire()メソッドが同期されたコンテキストで使用されない理由です。上記のウェブサイトの例を見てください。

それらはセマフォを作成します:

private Semaphore semaphore = new Semaphore(100);

次のような許可を取得します。

semaphore.acquire();

さて、2つ以上のスレッドが同時にacquire()を試みることは可能ではないでしょうか?もしそうなら、カウントに少し問題があります。

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

4

3 に答える 3

10

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

はい、基本的にはそれだけです。javadocで説明されているように、セマフォはスレッドセーフです。

メモリ整合性の影響:release()などの「release」メソッドを呼び出す前のスレッド内のアクションが発生します-別のスレッドでacquire()などの「acquire」メソッドが成功した後のアクションの前に発生します。

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

于 2013-02-15T10:42:00.930 に答える
3

セマフォは高速である必要があるため、CAS(コンペアアンドスワップ)Unsafeのように、クラスのアトミック同時実行プリミティブを使用します。

これらのプリミティブを使用すると、同期ははるかに低いレベルで行われ、モニターは必要ありません。(ロックフリー同期)。

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

于 2013-02-15T10:43:14.940 に答える
0

同期は、CAS操作を使用したAbstractQueuedSynchronizerによって保証されます

ここでjavadocを参照してください

于 2013-07-16T17:12:50.923 に答える