ホームページ Java &#&チュートリアル Java マルチスレッドのキーワード volatile、lock、synchronized の簡単な紹介

Java マルチスレッドのキーワード volatile、lock、synchronized の簡単な紹介

Sep 25, 2018 pm 03:36 PM
Javaマルチスレッド

この記事では、Java マルチスレッドのキーワード volatile、lock、synchronized について簡単に紹介します。必要な方は参考にしていただければ幸いです。 。

1. 揮発性

揮発性書き込みと揮発性読み取りのメモリ セマンティクス:

スレッド A は揮発性変数を書き込みます。これは本質的にスレッド A によるメモリへの書き込みです。この揮発性変数のスレッドがメッセージを発行しました (共有変数が変更されました)。スレッド B が volatile 変数を読み取るとき、本質的に、スレッド B は前のスレッドによって送信されたメッセージ (volatile 変数を書き込む前の共有変数への変更) を受信します。スレッド A が揮発性変数を書き込み、次にスレッド B がその揮発性変数を読み取ります。このプロセスは基本的に、スレッド A がメイン メモリを介してスレッド B にメッセージを送信します。

ロック解放とロック取得のメモリ セマンティクス:

スレッド A はロックを解放します。本質的に、スレッド A は次にロックを取得するスレッドにメッセージを送信します (スレッド A は変数を共有します)。修正)メッセージ。スレッド B はロックを取得します。本質的に、スレッド B は前のスレッド (ロックを解放する前に共有変数を変更した) によって送信されたメッセージを受信します。スレッド A がロックを解放し、次にスレッド B がロックを取得します。このプロセスは基本的に、スレッド A がメイン メモリを介してスレッド B にメッセージを送信します。

概要: volatile キーワードの役割は、変数を複数のスレッド間で可視化することですが、volatile だけではスレッドの安全性を保証できません。

2. lock

Lock はインターフェイスです:

public interface Lock {  
   void lock();     
   void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    void unlock();
    Condition newCondition();
}
ログイン後にコピー

lock()、tryLock()、tryLock(long time, TimeUnit 単位)、lockInterruptibly() は次の目的で使用されます。ロックを取得します。

unLock() メソッドはロックを解放するために使用されます。 tryLock() メソッドには戻り値があり、取得が成功した場合 (つまり、ロックが別のスレッドによって取得された場合) に true を返します。 false を返します。これは、このメソッドが何があってもすぐに返されることを意味します。ロックができないときにそこで待つ必要はありません。 tryLock(long time, TimeUnit単位)メソッドはtryLock()メソッドと似ていますが、時間内にロックを取得できない場合は一定時間待機する点が異なります。制限がある場合は false を返します。ロックが最初に取得された場合、または待機中に取得された場合は true を返します。 lockInterruptibly() メソッドは特別で、このメソッドを通じてロックを取得する場合、スレッドがロックの取得を待機している場合、スレッドは割り込みに応答できます。つまり、スレッドの待機状態を中断できます。つまり、2 つのスレッドが同時に lock.lockInterruptibly() を通じてロックを取得したいとき、この時点でスレッド A がロックを取得し、スレッド B が待機しているだけであれば、 threadB.interrupt() メソッドは次のようになります。スレッド B で呼び出されます。スレッド B の待機中のプロセスに割り込むことができます。

ロックは、ロックの取得プロセス中に中断される可能性があります。 lock はロックの取得を試みることができます。ロックが別のスレッドによって保持されている場合は false を返し、現在のスレッドをスリープさせません。 lock がロックを取得しようとすると、時間パラメータが渡されます。この時間範囲内にロックが取得されなかった場合、リクエストは終了します。 synchronized は自動的にロックを解除しますが、lock は自動的にロックを解除しません。注: lock() はコードの一部をロックするために使用できるため、ロックが解放されるまで他のコードは待機する必要があります。lock は同期のように自動的にロックを解放しないので、 try-finally をブロックし、ロックが確実に解放されるようにします。

Lock と synchronized には次の違いがあります。

1) Lock はインターフェースですが、synchronized は Java のキーワードであり、synchronized は組み込み言語の実装です。 # 2) 例外が発生すると、synchronized はスレッドによって占有されているロックを自動的に解放するため、デッドロックは発生しませんが、例外が発生したときに、Lock が unLock() を通じてロックを積極的に解放しないと、デッドロックが発生する可能性があります。デッドロックが発生するため、Lock を使用する場合は、finally ブロックでロックを解放する必要があります。

3) Lock を使用すると、ロックを待機しているスレッドが割り込みに応答できるようになりますが、synchronized を使用する場合はそれができません。 synchronized では、待機中のスレッドは永遠に待機し、割り込みに応答できません。

4) Lock を通じて、ロックが正常に取得されたかどうかを知ることができますが、synchronized ではこれを行うことはできません。

5) ロックにより、複数スレッドの読み取り操作の効率が向上します。パフォーマンスの点では、リソースの競合が激しくない場合、リソースの競合が非常に激しい (つまり、同時に多数のスレッドが競合している) 場合、両者のパフォーマンスはほぼ同じになります。 Lock のパフォーマンスは、synchronized のパフォーマンスよりもはるかに優れています。したがって、使用する場合には適切な状況に応じて選択する必要があります。 ReentrantLock は「再入可能なロック」を意味します。リエントラント ロックの概念については、次のセクションで説明します。 ReentrantLock は Lock インターフェイスを実装する唯一のクラスであり、ReentrantLock はさらに多くのメソッドを提供します。

3. synchronized

1. 2 つの同時スレッドが同じオブジェクト内の同期された (この) 同期コード ブロックにアクセスする場合、一度に 1 つのスレッドのみを実行できます。別のスレッドは、このコード ブロックを実行する前に、現在のスレッドがこのコード ブロックの実行を完了するまで待つ必要があります。

2. ただし、スレッドがオブジェクトの同期された (この) 同期コード ブロックにアクセスするとき、別のスレッドは引き続きオブジェクト内の非同期 (この) 同期コード ブロックにアクセスできます。

3. 特に重要なのは、スレッドがオブジェクトの同期された (この) 同期されたコード ブロックにアクセスすると、オブジェクト内の他のすべての同期された (この) 同期されたコード ブロックへの他のスレッドのアクセスがブロックされることです。

4. 3 番目の例は、他の同期コード ブロックにも適用できます。つまり、スレッドがオブジェクトの synchronized (this) 同期コード ブロックにアクセスすると、このオブジェクトのオブジェクト ロックを取得します。その結果、オブジェクト オブジェクトのすべての同期されたコード部分への他のスレッドのアクセスが一時的にブロックされます。 synchronized キーワードの範囲: オブジェクト インスタンス内で、synchronized aMethod(){} を使用すると、複数のスレッドがこのオブジェクトの synchronized メソッドに同時にアクセスすることを防ぐことができます (オブジェクトに複数の同期メソッドがある場合、1 つのスレッドがそのうちの 1 つにアクセスする限り)同期メソッド メソッドにアクセスすると、他のスレッドはこのオブジェクトの同期メソッドに同時にアクセスできなくなります)。現時点では、異なるオブジェクト インスタンスの同期メソッドは相互に干渉しません。つまり、他のスレッドは同じクラスの別のオブジェクト インスタンスの同期メソッドに同時にアクセスできます。特定のクラスのスコープ内では、同期静的 aStaticMethod{} により、複数のスレッドがこのクラスの同期静的メソッドにアクセスできなくなります。同時に。これは、クラスのすべてのオブジェクト インスタンスに対して機能します。

以上がJava マルチスレッドのキーワード volatile、lock、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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の 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開発最適化手法 ファイル読み込みマルチスレッド加速性能のためのJava開発最適化手法 Jun 30, 2023 pm 10:54 PM

Java 開発では、ファイルの読み取りは非常に一般的で重要な操作です。ビジネスが成長するにつれて、ファイルのサイズと数も増加します。ファイルの読み取り速度を向上させるために、マルチスレッドを使用してファイルを並行して読み取ることができます。この記事では、Java 開発におけるファイル読み取りマルチスレッド アクセラレーションのパフォーマンスを最適化する方法を紹介します。まず、ファイルを読み取る前に、ファイルのサイズと量を決定する必要があります。ファイルのサイズと数に応じて、スレッド数を適切に設定できます。スレッド数が多すぎるとリソースが無駄になる可能性があります。

Javaのvolatileキーワードの使用シナリオと機能の詳細な説明 Javaのvolatileキーワードの使用シナリオと機能の詳細な説明 Jan 30, 2024 am 10:01 AM

Java における volatile キーワードの役割と適用シナリオの詳細説明 1. volatile キーワードの役割 Java では、volatile キーワードは、複数のスレッド間で参照できる変数を識別する、つまり可視性を確保するために使用されます。具体的には、変数が volatile と宣言されると、その変数への変更は他のスレッドに即座に知られます。 2. Volatile キーワード ステータス フラグのアプリケーション シナリオ volatile キーワードは、次のようないくつかのステータス フラグ シナリオに適しています。

Java マルチスレッドの動作原理と特性を調べる Java マルチスレッドの動作原理と特性を調べる Feb 21, 2024 pm 03:39 PM

Java マルチスレッドの動作原理と特性を探る はじめに: 最新のコンピュータ システムでは、マルチスレッドは同時処理の一般的な方法となっています。 Java は強力なプログラミング言語として、豊富なマルチスレッド メカニズムを提供し、プログラマがコンピュータのマルチコア プロセッサを有効に活用し、プログラムの実行効率を向上させることができます。この記事では、Java マルチスレッドの動作原理と特性を探り、具体的なコード例で説明します。 1. マルチスレッドの基本概念 マルチスレッドとは、プログラム内で複数のスレッドを同時に実行し、各スレッドが異なる処理を実行することをいいます。

Java マルチスレッド環境での例外処理 Java マルチスレッド環境での例外処理 May 01, 2024 pm 06:45 PM

マルチスレッド環境での例外処理の重要なポイント: 例外のキャッチ: 各スレッドは try-catch ブロックを使用して例外をキャッチします。例外の処理: エラー情報を出力するか、catch ブロックでエラー処理ロジックを実行します。スレッドを終了する: 回復が不可能な場合は、Thread.stop() を呼び出してスレッドを終了します。 UncaughtExceptionHandler: キャッチされなかった例外を処理するには、このインターフェイスを実装し、スレッドに割り当てる必要があります。実際のケース: スレッド プールでの例外処理。UncaughtExceptionHandler を使用してキャッチされなかった例外を処理します。

Java マルチスレッド同時実行ロックの詳細な説明 Java マルチスレッド同時実行ロックの詳細な説明 Apr 11, 2024 pm 04:21 PM

Java 同時実行ロック メカニズムにより、マルチスレッド環境では共有リソースに 1 つのスレッドのみがアクセスできるようになります。その種類には、悲観的ロック (ロックを取得してからアクセスする) と楽観的ロック (アクセス後に競合を確認する) があります。 Java は、ReentrantLock (ミューテックス ロック)、Semaphore (セマフォ)、ReadWriteLock (読み取り/書き込みロック) などの組み込み同時実行ロック クラスを提供します。これらのロックを使用すると、複数のスレッドが共有変数カウンターに同時にアクセスしたときに、1 つのスレッドだけがその値を更新するなど、共有リソースへのスレッドセーフなアクセスを保証できます。

Java のマルチスレッドの安全性の問題 - java.lang.ThreadDeath の解決策 Java のマルチスレッドの安全性の問題 - java.lang.ThreadDeath の解決策 Jun 25, 2023 am 11:22 AM

Java は現代のソフトウェア開発で広く使用されているプログラミング言語であり、そのマルチスレッド プログラミング機能も Java の最大の利点の 1 つです。ただし、マルチスレッドによって引き起こされる同時アクセスの問題により、Java ではマルチスレッドの安全性の問題が頻繁に発生します。その中でも、java.lang.ThreadDeath は典型的なマルチスレッドのセキュリティ問題です。この記事ではjava.lang.ThreadDeathの原因と解決策を紹介します。 1. java.lang.ThreadDeath の理由

Java マルチスレッド パフォーマンス最適化ガイド Java マルチスレッド パフォーマンス最適化ガイド Apr 11, 2024 am 11:36 AM

『Java マルチスレッド パフォーマンス最適化ガイド』には、次の 5 つの主要な最適化ポイントが記載されています。 スレッドの作成と破棄のオーバーヘッドを削減する 不適切なロック競合を回避する 非ブロッキング データ構造を使用する Happens-Before 関係を活用する ロックフリーの並列アルゴリズムを検討する

Javaマルチスレッドデバッグ技術が明らかに Javaマルチスレッドデバッグ技術が明らかに Apr 12, 2024 am 08:15 AM

マルチスレッド デバッグ テクノロジの答え: 1. マルチスレッド コード デバッグの課題: スレッド間の相互作用により、複雑で追跡が困難な動作が発生します。 2. Java マルチスレッド デバッグ テクノロジ: 行ごとのデバッグ スレッド ダンプ (jstack) エントリおよび終了イベントの監視 スレッド ローカル変数 3. 実際のケース: スレッド ダンプを使用してデッドロックを検出し、監視イベントを使用してデッドロックの原因を特定します。 4. 結論: Java が提供するマルチスレッド デバッグ テクノロジは、スレッド セーフ、デッドロック、競合に関連する問題を効果的に解決できます。

See all articles