ホームページ  >  記事  >  Java  >  Java でのマルチスレッド同期を理解する方法

Java でのマルチスレッド同期を理解する方法

WBOY
WBOY転載
2023-05-01 11:01:06658ブラウズ

1. 先着順のスレッド

汚い例を挙げてみましょう: レストランのバスルームは非常に小さく、1 人がやっと入れる程度です。邪魔にならないよう、トイレを使用する人は浴室に入るときにドアを施錠する必要があります。トイレを共有リソースと考えることができ、トイレに行く必要がある多くの人を複数のスレッドとみなすことができます。トイレが現在使用されている場合は、その人がトイレを使い終えてドアを開けて出てくるまで、他の人は待たなければなりません。これは、複数のスレッドがリソースを共有する場合と同様に、先着順で優先順位を付ける必要があります。

誰かが言いました: このドアがなかったらどうなるでしょうか? 2 つのスレッドを互いに競争させます。最初に勝った方が先に作業できます。これはどの程度良いでしょうか?しかし、トイレにドアがなく、人々が一緒にトイレに行く場合、必然的に口論が起こり、トイレを使用する通常の手順が中断され、予期せぬ結果が発生する可能性が高いことはわかっています。間違った場所に肥料を与えてしまうことも… この扉があるからこそ、一人でトイレに入る人でも、トイレを塞がれることなくスムーズにトイレを終えることができるのですが、干渉すると思わぬ結果を招くこともあります。これは、トイレに行くときは先着順に行く必要があることを意味します。

では、Java マルチスレッド プログラムで、複数のスレッドが同じリソースをめぐって競合する場合、スレッドが「競合」しないようにするにはどうすればよいでしょうか?同期メカニズムを使用しているという人もいます。そうです、上の例は典型的な同期ケースです。最初のユーザーがトイレに行き始めると、2 番目のユーザーは最初のユーザーがトイレに行き終わるまで待たなければなりません。スレッドが特定のプロセスに入ると、次のスレッドがプロセスを開始する前に、通常の復帰を待ってプロセスを終了する必要があります。

ここで、最も重要なのはバスルームのドアです。実はトイレのドアはリソースロックの役割を果たしており、トイレに行く人がドアに鍵をかけている限りは鍵を手に入れたことに等しく、鍵を開けて出てくると鍵を解除したことに等しい。ロック。

言い換えれば、マルチスレッドのスレッド同期メカニズムは、実際にはロックの概念によって制御されます。では、ロックは Java プログラムにどのように反映されるのでしょうか?

JVM の観点からロックの概念を見てみましょう:

Java プログラムの実行環境では、JVM は 2 種類のスレッドによって共有されるデータを調整する必要があります。

1) ヒープに保存されるインスタンス変数

2) メソッド領域に保存されるクラス変数

これら 2 種類のデータは、すべてのスレッドで共有されます。 (プログラムは Java スタックに格納されているデータを調整する必要はありません。これらのデータはスタックを所有するスレッドにとってプライベートであるためです。)

Java 仮想マシンでは、各オブジェクトとクラスは論理的に関連付けられています。モニター。

オブジェクトの場合、関連付けられたモニターがオブジェクトのインスタンス変数を保護します。

クラスの場合、モニターはクラスのクラス変数を保護します。 (オブジェクトにインスタンス変数がない場合、またはクラスに変数がない場合、関連付けられたモニターは何も監視しません。)

モニターの排他的な監視機能を実現するために、Java 仮想マシンは、すべてのオブジェクトに関連付けられたロック。常に 1 つのスレッドのみが持つことを許可される特権を表します。スレッドは、インスタンス変数またはクラス変数にアクセスするためにロックを必要としません。

ただし、スレッドがロックを取得すると、ロックを解放するまで他のスレッドは同じデータ ロックを取得できません。 (オブジェクトをロックすることは、オブジェクトに関連付けられたモニターを取得することです)

クラス ロックは、実際にはオブジェクト ロックを使用して実装されます。仮想マシンがクラス ファイルをロードすると、java.lang.Class クラスのインスタンスが作成されます。オブジェクトがロックされると、実際にロックされるのはそのクラスの Class オブジェクトです。

スレッドは同じオブジェクトを複数回ロックできます。 Java 仮想マシンはオブジェクトごとにロック カウンタを維持します。スレッドがオブジェクトを取得するたびに、カウンタは 1 ずつ増分されます。オブジェクトが解放されるたびに、カウンタは 1 ずつ減分されます。カウンタ値が 0 に達すると、ロックは解除されます。完全に解放されます。

Java プログラマは自分でロックを追加する必要はありません。オブジェクト ロックは Java 仮想マシンによって内部的に使用されます。

Java プログラムでは、同期ブロックまたは同期メソッドを使用して監視領域をマークするだけです。監視エリアに入るたびに、Java 仮想マシンはオブジェクトまたはクラスを自動的にロックします。

以上がJava でのマルチスレッド同期を理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。