ホームページ >Java >&#&チュートリアル >Java のスレッド保護およびデッドロック検出テクノロジ

Java のスレッド保護およびデッドロック検出テクノロジ

WBOY
WBOYオリジナル
2023-06-09 09:41:361415ブラウズ

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 サイトの他の関連記事を参照してください。

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