同期の原理を紹介したいのですが、どこから始めればよいかわかりません。インターネットで外国人が書いた記事を見ましたが、スレッド同期に関する基礎知識がいくつか紹介されていました。なので、皆さんに見てもらえるように翻訳したいです。これらの基礎知識を読んでおくと、後で書く同期の原理がより理解しやすくなると思います。 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 情報ストリーム推奨におけるディープラーニングの実践
Sogouが「介入」して以来、360とBaiduの戦争は新たなレベルにエスカレートし、戦場はさらに拡...
Linode のバージョンアップがどんどん面白くなってきて、見てたら買いたくなりました! 512M ...
Tencent Cloud が、世界をリードする最新の汎用データベース プラットフォームである Mo...
5G、AR、AIoT などのシナリオが次世代クラウド アーキテクチャの進化を推進し、コンテナがクラウ...
1月5日、ResearchAndMarketsによると、世界のヘルスケアクラウドインフラストラクチャ...
aoyouhostの日本クラスターサーバー、直結回線、8C、無制限トラフィックをご紹介します。おそら...
私は湖北省の山奥出身の負け犬です。武漢で5年間働き、インターネットの経験は4年、ウェブマスターとして...
乳児用調合乳市場は特殊な業界です。調合乳のユーザーは製品に対する自分の気持ちを表現することができず、...
今日、私はこのトピックについて根拠もなく話しているのではなく、何人かのウェブマスター(SEO担当者)...
このようなタイトルを使うのは大げさに聞こえるかもしれないが、Baidu のドロップダウン ボックスは...
スタンフォード大学のロビン・リーBaidu の共同設立者兼 CEO である Robin Li 氏は本...
今朝、いつものように管理しているいくつかのウェブサイトを開いたところ、これらのウェブサイトのランキン...
[[380736]]この記事はWeChatの公開アカウント「Full-Stack Coder Por...
ここ数日、ウェブサイトに若干の変動があり、いつも以上に多くの問題について考えるようになりました。最近...
98cloud は秋のプロモーションのために期間限定のフラッシュセールを追加しました: 香港 CN2...