JavaセマフォとMutex–Java同時実行マルチスレッドとは例で説明されています

公開: 2015-03-12

CrunchifyによるJavaMutexとSemaphoreのチュートリアル

Javaの並行性は非常に幅広いトピックです。 使用できるチュートリアルと例は何百もあります。 しばらく前に、Javaでの複数のスレッドの同時実行とさまざまなタイプの同期ブロックに関するチュートリアルをいくつか作成しました。

このチュートリアルでは、以下について説明します。

  1. Mutexの説明
  2. セマフォの説明
  3. 詳細を含む2つの例

始めましょう

以下Let's keep this in mindてください。

  • 買い物客と顧客の例を見てみましょう
  • 買い物客はノートパソコンを借りています
  • 顧客はラップトップに来て使用できます–顧客はラップトップを使用するためのキーが必要です
  • 使用後–お客様はノートパソコンを買い物客に返却できます

Mutexとは(1スレッドのみ):

買い物客はラップトップの鍵を持っています。 一度に1人の顧客が鍵を持っている(ラップトップを借りる)ことができます。 タスクが終了すると、買い物客はキュー内の次の顧客にキーを渡します(解放します)。

Official Definition

「ミューテックスは通常、複数のスレッドでcannot be executed concurrently re-entrant codeのセクションへのアクセスをシリアル化するために使用されます。 ミューテックスオブジェクトは、制御されたセクションへの1つのスレッドのみを許可し、そのセクションへのアクセスを取得しようとする他のスレッドは、最初のスレッドがそのセクションから出るまで待機するように強制します。」

言い換えると、 Mutex = Mutually Exclusive Semaphore

セマフォとは(N個の指定されたスレッド):

今、ショッパーが3つの同一のラップトップと3つの同一のキーを持っているとしましょう。 セマフォは、 free identical Laptop keysの数です。 セマフォカウント(キーの数)は最初は3に設定され(3つのラップトップはすべて無料です)、顧客が来るとカウント値が減少します。すべてのラップトップが使用されている場合、つまり、ラップトップの場合、セマフォカウントは0です。これで、顧客のいずれかがラップトップを返却すると、セマフォが1(1つのフリーキー)に増加し、キュー内の次の顧客に渡されます。

Official Definition :「セマフォは、共有リソースの同時ユーザー数を最大数に制限します。 スレッドは、リソースへのアクセスを要求し(セマフォをデクリメント)、リソースの使用が終了したことを通知できます(セマフォをインクリメントします)。」

別の必読:シングルトンスレッドセーフインスタンスの遅延作成

例-1 :(以下の説明)

上記のチュートリアルで、 CrunchifyProducerは、 CrunchifySemaphoreMutexTutorial.javathreadNamecrunchifyListオブジェクトに追加すると、セマフォに信号を送ることができます。

CrunchifyConsumerは、セマフォを取得しようとしている可能性があるため、CrunchifyProducerがthreadIDが追加されたことを通知するまで待機します。 追加されたデータを通知すると、コンシューマーの1つがウェイクアップされ、crunchifyListオブジェクトを読み取ることができることがわかります。 リストを読み取ってから、セマフォの取得に戻ることができます。

その間にプロデューサーが別のパケットを書き込んだ場合、それは再びシグナルを送信し、コンシューマーのいずれかが別のパケットを読み取ります。

言い換えると:

結果:

競合状態を防ぐ方法:

What if you have multiple Consumers? 上記のJavaチュートリアルでは、競合状態を防ぐために、(プロデューサーではなく)コンシューマーがパケットを読み取るときに(セマフォを取得するときではなく)バッファーをロックする必要があります。 以下の例では、すべてが同じJVM上にあるため、プロデューサーもリストをロックします。

例-2:

結果: