同期の原理を紹介したいのですが、どこから始めればよいかわかりません。インターネットで外国人が書いた記事を見ましたが、スレッド同期に関する基礎知識がいくつか紹介されていました。なので、皆さんに見てもらえるように翻訳したいです。これらの基礎知識を読んでおくと、後で書く同期の原理がより理解しやすくなると思います。 Java 言語を知っている人なら誰でも、Java コードを JVM で実行するには、バイトコードで構成されるクラス ファイルに変換する必要があることを知っています。この記事では主に、Java 仮想マシンがバイトコード レベルでスレッド同期を実行する方法を分析します。 スレッドと共有データ Java プログラミング言語の強みの 1 つは、言語レベルでのマルチスレッドのサポートです。このサポートの多くは、複数のスレッドによる共有データへのアクセスの調整に重点を置いています。 JVM のメモリ構造には、主にスタック、ヒープ、メソッド領域などの重要な領域が含まれます。 Java 仮想マシンでは、各スレッドに独自のスタック メモリがあり、その中には、スレッドによって呼び出される各メソッドのローカル変数、パラメーター、戻り値が含まれます。他のスレッドはこのスタック メモリ ブロック内のデータを読み取ることができません。スタック上のデータは、プリミティブ型とオブジェクト参照に制限されます。したがって、JVM では、スタックは実際のオブジェクトを保存できず、オブジェクトへの参照のみを保存します。実際のオブジェクトはヒープに格納されます。 JVM では、ヒープ メモリはすべてのスレッドによって共有されます。ヒープにはオブジェクトのみが含まれ、それ以外は何も含まれません。したがって、基本型とオブジェクト参照はヒープ上に保存できません。ヒープとスタックには明確な役割分担があります。ただし、オブジェクトへの参照は、実際にはオブジェクトの一部です。ここで言及する価値があるのは、配列はヒープ上に格納され、基本的なタイプのデータもヒープ上に格納されるということです。 Java では配列はオブジェクトだからです。 スタックとヒープに加えて、クラスの静的変数など、一部のデータは JVM のメソッド領域に格納されることがあります。メソッド領域はスタックに似ており、基本型とオブジェクト アプリケーションのみが含まれます。スタックとは異なり、メソッド領域内の静的変数はすべてのスレッドからアクセスできます。 オブジェクトとクラスのロック 前述したように、JVM にはすべてのスレッドで共有できる 2 つのメモリ領域があります。
したがって、複数のスレッドが同じオブジェクトまたは静的変数に同時にアクセスする場合は、それらを制御する必要があります。そうしないと、予期しない結果が発生する可能性があります。 複数のスレッド間で共有データへのアクセスを調整するために、仮想マシンは各オブジェクトとクラスにロックを割り当てます。このロックは特権のようなもので、同時にこのクラスまたはオブジェクトを「所有」できるのは 1 つのスレッドだけです。スレッドがクラスまたはオブジェクトのロックを取得したい場合は、仮想マシンに問い合わせる必要があります。スレッドが仮想マシンにクラスまたはオブジェクトのロックを求めると、仮想マシンはスレッドにロックをすばやく割り当てることもあれば、ゆっくり割り当てることもあり、スレッドがロックを取得できないこともあります。スレッドがロックを必要としなくなったら、ロックを仮想マシンに返します。この時点で、仮想マシンはロックを申請する他のスレッドにロックを割り当てることができます。 クラス ロックは実際にはオブジェクト ロックを通じて実装されます。仮想マシンがクラスをロードすると、このクラスの java.lang.Class オブジェクトがインスタンス化されるためです。クラスをロックすると、実際には対応する Class オブジェクトがロックされます。 モニター モニターとロックは JVM によって同時に使用されます (著者は、ロックが実際にはモニターを通じて実装されることを意味していると理解しています)。モニターの主な機能は、コードのセクションを監視し、同時に 1 つのスレッドのみが実行されるようにすることです。 各モニターはオブジェクトに関連付けられています。スレッドがモニターによって監視されているコード ブロック内の最初の命令を実行する場合、スレッドは参照されるオブジェクトのロックを取得する必要があります。スレッドがロックを取得するまで、このコードを実行することはできません。ロックが取得されると、スレッドは「保護された」コードに入り、実行を開始できます。 スレッドがコード ブロックを離れると、その方法に関係なく、関連付けられたオブジェクトのロックが解除されます。 複数のロック 同じスレッドが同じオブジェクトを複数回ロックできます。各オブジェクトは、ロックされた回数を記録するカウンターを保持します。ロック解除されたオブジェクトのカウンターは 0 です。スレッドがロックを取得すると、カウンターは 1 に増加します。同じスレッドがオブジェクトのロックを再度取得すると、カウンターは再度増加します。同じスレッドがロックを解除すると、カウンターは再び減少します。カウンターが 0 の場合、ロックは解放され、他のスレッドがロックを取得できるようになります。 同期 Java では、複数のスレッドが同じ共有データにアクセスする必要がある場合、同期と呼ばれる調整方法があります。 Java 言語には、データへのスレッド アクセスを同期するための 2 つの組み込みの方法 (同期コード ブロックと同期メソッド) が用意されています。 この記事では、同期コード ブロックと同期メソッド、および実装方法についての簡単な紹介も行います。彼の紹介はあまりにも単純すぎると思うので、ここでは翻訳しません。詳しい記事は後ほど書きます。 元のアドレス: Java仮想マシンがスレッド同期を実行する方法 [この記事は、51CTOコラムニストのホリス、著者WeChatパブリックアカウントホリス(ID:hollischuang)によるオリジナル記事です] この著者の他の記事を読むにはここをクリックしてください |
<<: クラウドシステムの管理はITプロフェッショナルにとって大きな課題です
>>: Sina Weibo の Nanwei Hu: Weibo 情報ストリーム推奨におけるディープラーニングの実践
SEOの世界では、ウェブサイトのタイトルのキーワードが重要な意味を持つことは周知の事実です。その結果...
米国の有名かつ老舗のDDOS保護ホスト業者であるsharktechが6月に実施した最新のプロモーショ...
5月26日、2019年中国国際ビッグデータ産業博覧会が貴陽で開催されました。 Tencent Clo...
urpad買収後の新たな動きです。サーバーレンタル事業に着手しました。多角的な展開も必至です。企業は...
ウェブサイトのキーワードランキングにとって外部リンクが重要であることは誰もが知っていますが、ではどう...
百度は最近変動が激しく、6月14日の夜に比較的大きなアップデートがありました。多くのウェブマスターは...
本紙(記者:龔面牛英輝)は、一昨日、多くのネットユーザーが中国生命保険の保険契約者の情報がウェブサイ...
[51CTO.com からのオリジナル記事]ビジネスの急速な発展とビジネスの複雑性の増大に伴い、ほぼ...
kvmla から最新のプロモーション メールを送信しました: Kvmla は気づかないうちに 11 ...
以前はオンラインショッピング業界で働いていましたが、最近は医療業界に転向しました。医療業界の上司は皆...
著作権のある小説が百度の検索結果のトップに表示される(写真提供:テンセントテクノロジー)テンセントテ...
Cloudsilkは長年にわたり米国サンノゼデータセンターでVPSを提供しており、その中でもChin...
[51CTO.com クイック翻訳] サービスプロバイダーと企業は、今日のクラウドベースのアプリケー...
風が吹き、沂水河は冷たい。ウェブマスターになる運命で、戻ることはできないのでしょうか? 初心者のウェ...
フレンドリー リンクの交換は、SEO の最も重要なタスクの 1 つです。フレンドリー リンクの価値は...