Java 仮想マシンはどのようにしてスレッド同期を実行しますか?

Java 仮想マシンはどのようにしてスレッド同期を実行しますか?

同期の原理を紹介したいのですが、どこから始めればよいかわかりません。インターネットで外国人が書いた記事を見ましたが、スレッド同期に関する基礎知識がいくつか紹介されていました。なので、皆さんに見てもらえるように翻訳したいです。これらの基礎知識を読んでおくと、後で書く同期の原理がより理解しやすくなると思います。

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 情報ストリーム推奨におけるディープラーニングの実践

推薦する

ウェブマスターネットワークからの毎日のレポート:百度はLBSの開発を計画、一方グーグル中国はモバイル広告に目を向ける

1. 百度の構造調整:事業分割によりLBS部門を設立Baidu の地図部門は最近、LBS (位置情報...

Cloud Native Sqoop on k8s の解説と実践的な操作

1. 概要Sqoop は、構造化データと Hadoop 間のバッチデータ移行のためのツールです。構造...

国内ドメイン名登録業者トップ3:中国は4.92%で3位

中国IDCレビューネットワークは12月18日に次のように報じた。ドメイン名統計機関WebHostin...

個々のユーザーはどのようにして安全にソフトウェアを選択できるのでしょうか?

中国のパソコンユーザーにとって、パソコンにインストールされているソフトウェアのほとんどはおそらくフリ...

Aoyou Hosting 香港 CN2 VPS (安昌データセンター、10Mbps 帯域幅) の簡単なレビュー

数日前、緊急の目的で、CN2 回線を使用して、Aoyou Host の香港安昌データセンターに VP...

Meilishuo によるウォーターフォール フロー ウェブサイトの画像最適化の詳細を垣間見る

人間は視覚に敏感な動物であり、単調なテキストよりも画像を好むことが多いと言われています。インターネッ...

希少なクラウドコンピューティングの人材を見つける方法

特定のクラウド コンピューティング スキルを持つ人、またはクラウド アーキテクチャやセキュリティを理...

経済不確実性の中でクラウド支出を削減

企業が経済の不確実性を乗り越え続ける中、IT リーダーは予算を最適化し、クラウド インフラストラクチ...

SEO知識の普及:新旧ウェブサイトのSEO最適化プロセス

ウェブサイトの最適化をどのように開始するかは、常に多くの初心者を悩ませる問題です。今日、天津 SEO...

VMware とパートナーは、データとデジタル主権を包括的に強化するためにクラウド主権の新たな領域を計画しています。

デジタル経済の時代において、データは企業の中核資産となり、ビジネス革新を加速させることができます。ク...

Baiduの資産を見てみましょう

百度の香港上場再開に関する重要な情報が公開された。百度は3月12日に世界規模の株式公開を開始し、公開...

推奨: globalfrag/CN2 ネットワーク/$10/512M メモリ/50g ハードディスク/500g トラフィック/ロサンゼルス

globalfrag.com の魔法の割引コードが再び登場しました。どの VPS を購入しても永久に...

外部リンクが存在する理由についての簡単な説明

SEO 最適化は、一般的にオンサイト最適化とオフサイト最適化の 2 つの部分に分けられます。オンサイ...

Baidu が私のホームページを K にした理由と対処方法

10月28日、暗い日曜日。その夜、私のウェブサイト「永輝国際コレクション文化交流センター」の百度スナ...