同期の原理を紹介したいのですが、どこから始めればよいかわかりません。インターネットで外国人が書いた記事を見ましたが、スレッド同期に関する基礎知識がいくつか紹介されていました。なので、皆さんに見てもらえるように翻訳したいです。これらの基礎知識を読んでおくと、後で書く同期の原理がより理解しやすくなると思います。 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 情報ストリーム推奨におけるディープラーニングの実践
いわゆるセカンドレベルドメイン名とは、xxx.com/xxx.html のようなドメイン名のことで、...
2012 年第 7 回中国インターネット ウェブマスター年次会議は、4 月 7 日に北京国際会議セン...
中秋節 + 国慶節に合わせて、onetechcloud は 10 月のゴールデン ウィークに特別プロ...
IDC Review Network (idcps.com) は 3 月 21 日に次のように報告し...
WeChat 5.0のリリースは、最近比較的大きなニュースです。コミュニケーション機能から始まった製...
618 の期間全体を振り返ってみると、ビリビリの電子商取引事業はまだ大きな成果を上げていません。生放...
編集者注: 2013 年中国インターネット起業家会議 (http://2013.loohua.com...
オンライン マーケティング企業にとって最も重要なのは、サイト トラフィックだけでなく、サイト トラフ...
ウェブサイトの最適化は派手な名前のように聞こえますが、最も基本的な作業は退屈なコンテンツの更新と外部...
ウェブサイトのキーワードは、ロングテールキーワード、メインキーワード、コラムキーワードなどに分けられ...
背景情報: Ce氏——Ceenの「世界名靴淘宝」プロモーションコンテストの特別審査員昇格コンテストの...
フォーラムでは、ナビゲーション、トピック、推奨事項、ランキングなどの一連の手段の最終的な目標は、ユー...
検索エンジン最適化 (SEO) 業界で働く友人たちは、とても苦労しています。退屈で面倒な作業に対処す...
hostnine の利点は何ですか?まず言いたいのは、シンガポールとアメリカにデータセンターがあり、...
高速な香港 VPS を購入して「言葉では言い表せない」インターネット アクセスを実現したいだけで、あ...