5

誰かがJavaのさまざまな同期方法のさまざまな違いを説明できますか?

  • 同期されたブロック (モニターなど?)
  • ロック - Java コンカレント lock.lock()/lock.unlock()
  • セマフォ..?
  • Object.wait() & Object.notify() (ミューテックスのような?)
  • その他のクラス

したがって、一般的に使用されるさまざまな Java 同期オプションと、それらが「従来の」/理論上のミューテックス、セマフォ、ロック、およびモニターにどのようにマップされるかを知りたかったのです。

乾杯!

4

2 に答える 2

3

それぞれについて簡単に説明します。

  • 同期ブロックは、平均的なクリティカル セクションです。多くの制御は与えられていません。一度にロックを取得できるスレッドは 1 つだけであり、同期スコープが終了すると自動的に解放されます。
  • ロックは、同期ブロックのより柔軟なバージョンです。実装に応じて、それらは再入可能であるかtryLock、解放されている場合にのみロックを取得しようとするような操作をサポートする場合があり、それ以外の場合はすぐに戻ります。ロックは明示的にアンロックする必要があります。
  • セマフォは基本的にロックですが、複数のスレッドが一度にクリティカル セクションに入るという機能が追加されています。これは、より一般的な「許可」の概念に基づいて動作します。セマフォは、スレッドが取得したい複数の許可を使用できる場合があります。スレッドは、1 つ以上の許可を取得し、1 つ以上の許可を復元する場合があります。「保護する必要があるコード」という観点からではなく、「利用可能なリソース」という観点から同期について考えることができます。
  • wait / notify条件変数の概念とほぼ同じです。同様に、それらは同期ブロックによって保護されている必要があり、モニターとして使用されているオブジェクトでロックが保持されているときに呼び出された場合にのみ正しく機能します。
于 2012-04-17T09:51:34.560 に答える
1

Javaは、スレッド化と同期をネイティブにサポートしています。スレッドを同期するネイティブ(または低レベル)の方法は、同期されたブロックとメソッド(==クリティカルセクション)、wait()およびを使用することnotify()です。

このテクニックを使用すると、やりたいことをすべて行うことができますが、残念ながら、その方法はかなり冗長な場合があります。Doug Leaは、最初にApacheプロジェクトで並行性パッケージを開発しました。その後、このパッケージはSunMicrosystemsに採用されました。このパッケージは、より便利なAPIを提供します。

詳細については、この記事を参照してください:http: //docs.oracle.com/javase/tutorial/essential/concurrency/

于 2012-04-17T08:26:26.347 に答える