Java のスレッド保護およびデッドロック検出テクノロジ
Java のスレッド保護およびデッドロック検出テクノロジ
Java は、エンタープライズ レベルのアプリケーションで広く使用されているオブジェクト指向プログラミング言語として、強力なマルチスレッド プログラミング機能を備えています。実際のアプリケーションプロセスでは、スレッド保護とデッドロック検出テクノロジーが非常に重要であり、スレッドの安全性とアプリケーションの信頼性を効果的に確保できます。この記事ではこれについて説明します。
1. スレッド保護テクノロジー
スレッド保護とは、マルチスレッド プログラムが同じ共有リソースに同時にアクセスするときにデータの正確性と整合性を確保できるように、共有リソースを制限および制御することを指します。時間、性別。 Java は、ミューテックス ロック、セマフォ、条件変数という 3 つのスレッド保護テクノロジを提供します。
1. ミューテックス ロック
ミューテックス ロックは、最も基本的なスレッド保護テクノロジです。ミューテックス ロックの保護下では、共有リソースにアクセスできるのは 1 つのスレッドだけであり、他のスレッドはアクセスする前にミューテックス ロックが解放されるまで待つ必要があります。 Java では、ミューテックス ロックは主に synchronized キーワードを通じて実装されます。
次は、ミューテックス ロックの簡単な例です:
class Counter { private int count = 0; //使用 synchronized 实现互斥锁 public synchronized void increment(){ count += 1; //模拟执行某些操作 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count); } } public class MutexExample { public static void main(String[] args) throws InterruptedException { Counter counter = new Counter(); //创建两个线程并行执行 Thread t1 = new Thread(() -> { for (int i = 0; i < 3; i++) { counter.increment(); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 3; i++) { counter.increment(); } }); t1.start(); t2.start(); //等待两个线程执行完毕 t1.join(); t2.join(); } }
2. セマフォ
セマフォは、複数のスレッドからアクセスできるスレッド保護テクノロジです。カウンタを介して共有リソースにアクセスできるスレッドの数を維持します。スレッドが共有リソースにアクセスしたいときは、最初にセマフォを申請する必要があります。セマフォ カウンタが 0 より大きい場合、スレッドは共有リソースにアクセスできます。それ以外の場合、スレッドはセマフォを待つ必要があります。カウンターは 0 より大きい場合にのみアクセスできます。
Java では、セマフォは主に Semaphore クラスを通じて実装されます。例は次のとおりです:
import java.util.concurrent.Semaphore; class Counter { private int count = 0; private Semaphore sem = new Semaphore(1); //使用 Semaphore 实现线程保护 public void increment(){ try { sem.acquire(); count += 1; //模拟执行某些操作 Thread.sleep(1000); System.out.println(count); sem.release(); } catch (InterruptedException e) { e.printStackTrace(); } } } public class SemaphoreExample { public static void main(String[] args) throws InterruptedException { Counter counter = new Counter(); //创建两个线程并行执行 Thread t1 = new Thread(() -> { for (int i = 0; i < 3; i++) { counter.increment(); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 3; i++) { counter.increment(); } }); t1.start(); t2.start(); //等待两个线程执行完毕 t1.join(); t2.join(); } }
3. 条件変数
条件変数は、特定の条件が満たされるまで待機するスレッド 後で実行を継続するスレッド保護テクノロジ。ミューテックス ロックと組み合わせて使用できます。 Java では、条件変数は主に Condition インターフェイスと ReentrantLock クラスを通じて実装されます。例は次のとおりです:
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; class Counter { private int count = 0; private ReentrantLock lock = new ReentrantLock(); private Condition cond = lock.newCondition(); public void increment() { lock.lock(); try { count += 1; //模拟执行某些操作 Thread.sleep(1000); System.out.println(count); cond.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void waitUntil(int target) { lock.lock(); try { while (count < target) { cond.await(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } public class ConditionVariableExample { public static void main(String[] args) throws InterruptedException { Counter counter = new Counter(); //创建两个线程并行执行 Thread t1 = new Thread(() -> { for (int i = 0; i < 3; i++) { counter.increment(); } }); Thread t2 = new Thread(() -> { counter.waitUntil(3); System.out.println("Target reached"); }); t1.start(); t2.start(); //等待两个线程执行完毕 t1.join(); t2.join(); } }
2. デッドロック検出テクノロジ
デッドロックとは、複数のスレッドが互いに待機していることを指します。保持しているリソースが解放され、プログラムが実行を続行できなくなります。 Java は、デッドロックを検出して回避するためのツールとテクニックを提供します。
1.jstack
jstack は Java 実行環境によって提供されるツールで、Java 仮想マシンの各スレッドが占有している CPU の状態と保持されているロックを表示するために使用できます。スレッドと待機中のロックによって。 jstack はスレッドのスタック トレースを出力し、スレッドが占有しているリソースを確認してデッドロックが発生しているかどうかを判断します。
2.jvisualvm
jvisualvm は、JDK に付属するグラフィカル ツールで、スレッド、CPU、メモリ、スタックなどのリソースの使用状況を監視するために使用できます。 jvisualvm を通じて、スレッドが占有しているリソースを簡単に確認し、デッドロックを適時に検出および診断し、対応する措置をタイムリーに講じることができます。
3.ThreadMXBean
ThreadMXBean は Java 管理インターフェイスの 1 つで、スレッド ステータスやスレッド CPU 使用率など、JVM 内のスレッドを監視および管理するために使用できるいくつかのツールとメソッドを提供します。 . 状況、スレッド占有ロック、スレッドデッドロック、その他の情報。 ThreadMXBean を使用すると、プログラム内のデッドロックの問題を簡単に特定し、タイムリーな調整と最適化を行うことができます。
概要
この記事では、Java のスレッド保護およびデッドロック検出テクノロジの簡単な紹介とデモンストレーションの例を提供します。実際の開発では、マルチスレッド プログラムの正確性と信頼性を確保し、アプリケーションのパフォーマンスと安定性を向上させるために、これらのテクノロジを注意深く理解して習得する必要があります。
以上がJava のスレッド保護およびデッドロック検出テクノロジの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。
