web-dev-qa-db-ja.com

同期対セマフォ

Javaで並行性を読んでいる間、私は以下の疑問を抱えています:

  1. Javaは低レベルの構成を提供し、同期のために同期されますか?

  2. 同期化されたセマフォを使用する状況(Javaでのモニター動作を提供する)

22
Addict

Synchronizedはone実行のスレッドのみが同時にリソースにアクセスすることを許可します。セマフォでは、最大n(nを選択できます)の実行スレッドで同時にリソースにアクセスできます。

42
Marichyasana
  1. http://docs.Oracle.com/javase/tutorial/essential/concurrency/atomic.html によると、volatileキーワードもありますvolatile変数へのアクセスは、同期コードを介してこれらの変数にアクセスするよりも効率的です

  2. Java.util.concurrent.Semaphoreは、リソースにアクセスできるスレッドの数を制限するために使用されます。つまり、synchronizedは1つのスレッドのみがロックを取得して同期化されたブロック/メソッドを実行できるようにしますが、セマフォは最大n個のスレッドに許可を与え、他のスレッドをブロックします。

8

atomics もあります。これにより、すべての同期の基礎となる基本的なハードウェアのcompare-and-swapコマンドにアクセスできます。たとえば、安全に数値をインクリメントできます。もし、あんたが ++揮発性フィールド。同じ命令を実行する別のスレッドが、スレッドがフィールドに書き込む前にフィールドを読み取り、その後、スレッドにafter書き戻します。したがって、1つの増分が失われます。アトミックは「アトミック」に読み書きを行うため、問題を回避できます。

実際には、揮発性、同期化されたステートメント、およびアトミックは、すべてのスレッドデータを強制的にメインメモリから更新するか、メインメモリに適切に書き込む傾向があります。それらのどれも本当にその低レベルではありません。 (ここでは簡略化しています。C#とは異なり、Javaには「メインメモリ」の概念はありません。)

3
RalphChapin