ホームページ Java &#&チュートリアル Java での synchronized キーワードの使用法の概要 (コード例)

Java での synchronized キーワードの使用法の概要 (コード例)

Jan 30, 2019 am 11:21 AM
synchronized

この記事では、Java での synchronized キーワードの使用法 (コード例) を紹介します。参考にしていただければ幸いです。それはあなたの役に立つでしょう。

同時プログラミングでは、synchronized キーワードは一般的な役割です。以前は synchronized キーワードを重みロックと呼んでいましたが、JDK1.6 では synchronized が最適化され、バイアス ロックと軽量ロックが導入されました。この記事では、synchronized キーワードの使用方法、バイアス ロック、軽量ロック、重いロックの違いと実装原則を紹介します。

まず、synchronized キーワードの 4 つの使用法を見てみましょう。

1. 通常のメソッドを変更します

private synchronized void synMethod(){
}
ログイン後にコピー

この使用法では、オブジェクト同期ロックのインスタンス。

2. 静的メソッド

private static synchronized void synMethod(){
}
ログイン後にコピー

synchronized を変更します。現在のクラスオブジェクトです。

3. 同期メソッド ブロック

private  void synMethod1(){
        synchronized(this){
            
        }
    }    
    private  void synMethod2(){
        synchronized(ThreadTest.class){
            
        }
    }
ログイン後にコピー

synMethod2 のオブジェクト インスタンスをロックします。現在のクラスオブジェクト。

ロック原則を再度紹介します

ロック原則を紹介する前に、まず Java オブジェクト ヘッダー Mark Word について理解しましょう。32-例として少し。

##ロックが偏っているかどうかロックフラグ軽量ロックスタック内のロック レコードへのポインタ0重量ロック空11##バイアスロックスレッド

##ロック ステータス

25 ビット

4ビット

1ビット

2ビット

#23 ビット

##2bit

#ミューテックス (ヘビーウェイト ロック) へのポインタ

#10

#GC

マーク

ID##エポック

オブジェクト生成年齢

#1

#01

ロックなし

オブジェクトのハッシュコード

#オブジェクト生成年齢

0

01

上の表は、オブジェクトが各ロック状態にあるときにオブジェクト ヘッダーに格納される情報を示しています。

1. バイアスされたロック

#実際の環境では、スレッドが同期ブロックにアクセスするときに、他のスレッドがロックを競合しない場合同じスレッドが複数回ロックを取得します。つまり、単一のスレッドが同期コードを実行します。この場合、スレッドが毎回ブロックされると、CPU パフォーマンスが無駄になります。この場合、バイアスされたロックの概念が導入されます。

  • 同期されたコード ブロックへのアクセス

  • ## オブジェクト ヘッダーの Mark Word に格納されているスレッド ID が現在のスレッドを指しているかどうかを確認します。そうであれば、現在のロックが再入可能であることを示します。ロックを取得して同期コードを直接実行する必要はありません。

  • #そうでない場合は、CAS アルゴリズムを使用して、オブジェクト ヘッダー内のスレッド ID を更新してみてください。
  • #正常にロックを取得し、同期コードを実行します。更新に失敗した場合は、ロックの競合が存在することを示します。グローバル セーフ ポイントを待って、バイアスされたロックを所有するスレッドを一時停止し、バイアスされたロックを軽量ロックにアップグレードするか、ロック フラグに従ってロックなしに設定するかを選択します。オブジェクトヘッダー。
  • -XX:-userBiasedLocking=false を使用すると、JVM バイアス ロックの最適化をオフにし、デフォルトで軽量ロックを直接入力できます。

2. 軽量ロック

アクセス同期コード ブロック, まず、現在のスレッドのスレッドスタックにロックレコード(Lock Record)領域を作成します。

  • オブジェクト ヘッダー Mark Word をロック レコードにコピーします。

  • CAS を使用して、オブジェクト ヘッダーのスレッド ポインターを更新してみます。Word を現在のスレッドへのポインターにマークします。

  • 更新が成功すると、軽量のロックが得られます。

  • 更新に失敗しました。Mark Word のポインタが現在のスレッドを指しているかどうかを確認してください。

  • 「はい」の場合、ロックは再入可能であることを意味します。同期されたコード ブロックを実行します

  • そうでない場合は、現時点で競合があることを意味します。軽量ロックは重量ロックに拡張する必要があります。

  • 3. ウェイト ロック

  • ウェイト ロックは、オブジェクト モニター (Monitor) に基づいて実装されます。

#スレッドが同期コードを実行するときは、Monitor.enter 命令を呼び出す必要があります。実行が終了したら、Monitor.exit 命令を呼び出します。ここで、モニターが排他的であることがわかります。ある時点で正常に参加できるのは 1 つのスレッドだけであり、他のスレッドはキュー内でのみブロックされます。したがって、このウェイトロックの運用には非常にコストがかかります。

以上がJava での synchronized キーワードの使用法の概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java での Synchronized の原理と使用シナリオ、および Callable インターフェイスの使用法と差異分析 Java での Synchronized の原理と使用シナリオ、および Callable インターフェイスの使用法と差異分析 Apr 21, 2023 am 08:04 AM

1. 基本機能 1. 楽観的ロックで開始し、ロック競合が多発する場合は悲観的ロックに変換する 2. 軽量なロック実装で開始し、長時間ロックを保持するとロックを解除する3. 軽量ロックを実装するときに最もよく使用されるスピン ロック戦略 4. 不公平なロックである 5. リエントラント ロックである 6. 読み取り/書き込みロックではない 2. JVMロック プロセスを同期します。 ロックは、ロックなし、バイアスされたロック、軽量ロック、および重量ロックの状態に分類されます。状況に応じて順次バージョンアップしていきます。偏ったロックは男主人公を鍵、女主人公をスレとするもので、このスレッドだけがこのロックを使用すれば、たとえ結婚証明書を取得しなくても男主人公と女主人公は永遠に幸せに暮らせる(高額回避) -コストオペレーション)しかし、女性のサポート役が登場します

Javaキーワード同期原理とロック状態の分析例 Javaキーワード同期原理とロック状態の分析例 May 11, 2023 pm 03:25 PM

1. Java におけるロックの概念 Spin ロック: スレッドがロックを取得するとき、そのロックが別のスレッドによって取得されている場合、スレッドはループで待機し、ロックが正常に取得できるかどうかを判断し続けます。ロックが取得されると、ロックはループを終了します。楽観的ロック: 競合がないことを前提として、データを変更する際に以前に取得したデータと不整合が見つかった場合、最新のデータを読み込み、変更を再試行します。悲観的ロック: 同時実行性の競合が発生することを想定し、すべてのデータ関連操作を同期し、データが読み取られた時点からロックを開始します。排他的ロック (書き込み): リソースに書き込みロックを追加します。スレッドはリソースを変更できますが、他のスレッドはリソースを再度ロックすることはできません (単一書き込み)。共有ロック (読み取り): リソースに読み取りロックを追加した後、読み取りのみ可能ですが変更はできません。他のスレッドは読み取りロックのみを追加でき、書き込みロック (複数) を追加できません。 S として参照

synchronized を使用して Java で同期メカニズムを実装するにはどうすればよいですか? synchronized を使用して Java で同期メカニズムを実装するにはどうすればよいですか? Apr 22, 2023 pm 02:46 PM

Java 1 での synchronized の使い方のまとめ。関数修飾子として synchronized を使用した場合のサンプルコードは次のようになります: Publicsynchronizedvoidmethod(){//….} これが同期メソッドですが、このときどのオブジェクトが同期ロックされているのでしょうか?彼がロックするのは、この同期されたメソッド オブジェクトを呼び出すことです。言い換えれば、オブジェクト P1 がこの同期メソッドを異なるスレッドで実行すると、同期効果を達成するために相互排他が形成されます。ただし、このオブジェクトが属するクラスが生成する別のオブジェクトP2は、synchronizedキーワードを付加してこのメ​​ソッドを任意に呼び出すことができる。上記のサンプルコードなど。

Java の 3 つの同期方法とその使用方法は何ですか? Java の 3 つの同期方法とその使用方法は何ですか? Apr 27, 2023 am 09:34 AM

1. 同期は最も一般的に使用される同期方法であり、これには主に 3 つの使用方法があることを説明します。 2. 例//一般的なクラス メソッドの同期 synchronizedpublidvoidinvoke(){}//クラスの静的メソッドの同期 synchronizedpublicstaticvoidinvoke(){}//コード ブロックの同期 synchronized(object){}これら 3 つのメソッドの違いは、同期されるオブジェクトが異なることです。通常のクラスはオブジェクト自体を同期し、静的メソッドはクラス自体を同期し、コード ブロックは括弧内のオブジェクトを同期します。 Javaにはどのようなコレクションがありますか?

Java 同期ロックのアップグレードの原理とプロセスは何ですか? Java 同期ロックのアップグレードの原理とプロセスは何ですか? Apr 19, 2023 pm 10:22 PM

ツールの準備 同期の原理について正式に説明する前に、まずスピン ロックについて話しましょう。スピン ロックは同期の最適化に大きな役割を果たすためです。スピン ロックを理解するには、まずアトミック性とは何かを理解する必要があります。いわゆるアトミック性とは、単に各操作が行われないか完了することを意味します。すべてを行うということは、操作中に中断できないことを意味します。たとえば、変数データに 1 を追加するには、次の 3 つのステップがあります: メモリからレジスタにロードする。データの値に 1 を加算します。結果をメモリに書き込みます。原子性とは、スレッドがインクリメント操作を実行しているときに、他のスレッドによって中断できないことを意味し、このスレッドがこれら 3 つのプロセスを完了した場合にのみ実行されます。

Java では、synchronized キーワードを使用するだけでなく、Lock を提供する必要があるのはなぜですか? Java では、synchronized キーワードを使用するだけでなく、Lock を提供する必要があるのはなぜですか? Apr 20, 2023 pm 05:01 PM

概要: synchronized キーワードは、1 つのスレッドのみが同期されたコード ブロックにアクセスできるようにするために Java で提供されています。 synchronized キーワードが提供されているのに、なぜ Lock インターフェースも Java SDK パッケージで提供されるのですか?これは不必要な車輪の再発明でしょうか?今日はこの問題について一緒に話し合います。 Java では synchronized キーワードが提供され、1 つのスレッドのみが同期されたコード ブロックにアクセスできるようにします。 synchronized キーワードが提供されているのに、なぜ Lock インターフェースも Java SDK パッケージで提供されるのですか?これは不必要な車輪の再発明でしょうか?今日は一緒にそれについて話し合いましょう

Java同期とは Java同期とは May 14, 2023 am 08:28 AM

Synchronized とは何ですか? Java 読者は synchronized キーワードに馴染みがありません。これはさまざまなミドルウェア ソース コードや JDK ソース コードで見ることができます。synchronized に詳しくない読者にとっては、synchronized キーワードは複数の言語で使用する必要があることだけを知っています。 -threading.synchronized によりスレッドの安全性を確保できます。これは、ミューテックス ロック (同時に 1 つのスレッドだけが実行でき、他のスレッドは待機します)、または悲観的ロック (同時に 1 つのスレッドだけが実行でき、他のスレッドは待機します) と呼ばれます。JVM 仮想マシンは、開発者は synchronized キーワードを使用するだけで済みます。使用する場合は、ロックのミューテックスとしてオブジェクトを使用する必要があります

Java にはアクセス以外の修飾子がいくつありますか? Java にはアクセス以外の修飾子がいくつありますか? Aug 30, 2023 pm 06:01 PM

Java には、可視性を超えた機能を提供する他の修飾子がいくつか用意されています。これらの修飾子は非アクセス修飾子と呼ばれ、静的として宣言された静的メンバーはクラスのすべてのインスタンスに共通です。静的メンバーは、クラス メモリに格納されるクラス レベルのメンバーです。 Final この修飾子は、変数、メソッド、またはクラスへのさらなる変更を制限するために使用されます。 Final として宣言された変数の値は、その値を取得した後は変更できません。 Final メソッドをサブクラスでオーバーライドしたり、Final クラスのサブクラスを作成したりすることはできません。 Abstract この修飾子はクラスまたはメソッドで使用できます。この修飾子を変数やコンストラクターに適用することはできません。抽象として宣言されたメソッドはサブクラスで変更する必要があります。抽象宣言されたクラスをインスタンス化することはできません。同期 この修飾子は、複数のスレッドを制御するために使用されます。

See all articles