ホームページ >Java >&#&チュートリアル >Javaのロック機構を使用してスレッド同期を実現するにはどうすればよいですか?

Javaのロック機構を使用してスレッド同期を実現するにはどうすればよいですか?

WBOY
WBOYオリジナル
2023-08-02 13:47:021249ブラウズ

Java でロック メカニズムを使用してスレッド同期を実現するにはどうすればよいですか?

マルチスレッド プログラミングでは、スレッドの同期は非常に重要な概念です。複数のスレッドが同時に共有リソースにアクセスして変更すると、データの不整合や競合状態が発生する可能性があります。 Java は、これらの問題を解決し、共有リソースへのスレッドセーフなアクセスを保証するロック メカニズムを提供します。

Java のロック メカニズムは、synchronized キーワードと Lock インターフェイスによって提供されます。次に、これら 2 つのメカニズムを使用してスレッド同期を実現する方法を学びます。

synchronized キーワードを使用してスレッド同期を実装する例:

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

class IncrementThread extends Thread {
    private Counter counter;

    public IncrementThread(Counter counter) {
        this.counter = counter;
    }

    public void run() {
        for (int i = 0; i < 1000; i++) {
            counter.increment();
        }
    }
}

public class SynchronizedExample {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();

        IncrementThread thread1 = new IncrementThread(counter);
        IncrementThread thread2 = new IncrementThread(counter);

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("Final count: " + counter.getCount());
    }
}

上の例では、Counter クラスには、カウンターの値を表すために使用される count 変数があります。 increment() メソッドは synchronized キーワードを使用して変更されています。これは、常に 1 つのスレッドだけが count 変数にアクセスして変更できることを意味します。 getCount() メソッドも synchronized キーワードを使用して変更され、カウンター値を取得する際のスレッドの安全性が確保されます。

IncrementThread クラスは、Counter オブジェクトをコンストラクター パラメーターとして受け取り、run() メソッドの increment() メソッドを呼び出してカウンターの値を増やすスレッド クラスです。

メイン プログラムでは、2 つの IncrementThread スレッドを作成し、それぞれ 2 つのスレッド インスタンスに渡します。次に、これら 2 つのスレッドを開始し、join() メソッドを使用して完了するまで待ちます。最後に、最終的なカウンター値を出力します。

Lock インターフェイスを使用してスレッド同期を実装する例:

class Counter {
    private int count = 0;
    private Lock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}

class IncrementThread extends Thread {
    private Counter counter;

    public IncrementThread(Counter counter) {
        this.counter = counter;
    }

    public void run() {
        for (int i = 0; i < 1000; i++) {
            counter.increment();
        }
    }
}

public class LockExample {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();

        IncrementThread thread1 = new IncrementThread(counter);
        IncrementThread thread2 = new IncrementThread(counter);

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("Final count: " + counter.getCount());
    }
}

上の例では、Lock インターフェイスを Counter クラスの increment() メソッドと getCount() メソッドで使用して実装しています。スレッドの同期。 ReentrantLock インスタンスを作成して、メソッドの開始時と終了時にそれぞれロックを取得および解放します。

IncrementThread クラスとメイン プログラムのコードは、前の例と同じです。スレッドの同期を実現するには、Counter クラスの synchronized キーワードの代わりに Lock インターフェイスを使用するだけです。

概要:

マルチスレッド プログラミングでは、スレッドの同期は重要な概念です。 Java は、スレッドの同期を実現するために、synchronized キーワードと Lock インターフェイスを提供します。どのメカニズムが使用されるかに関係なく、いつでも 1 つのスレッドだけが共有リソースにアクセスして変更できることが保証され、それによってスレッドセーフなアクセスが保証されます。

上記は、Java のロック機構を使用してスレッド同期を実現するサンプル コードです。これらの例を理解して研究することで、スレッド同期をより適切に適用して、マルチスレッド プログラムの正確さとパフォーマンスを保証できるようになります。

以上がJavaのロック機構を使用してスレッド同期を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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