ホームページ  >  記事  >  Java  >  Java 関数の同時実行性とマルチスレッドにおけるセマフォの役割は何ですか?

Java 関数の同時実行性とマルチスレッドにおけるセマフォの役割は何ですか?

WBOY
WBOYオリジナル
2024-04-27 12:18:01976ブラウズ

セマフォは、Java 同時プログラミングにおけるマルチスレッド リソース アクセスを制御するためのメカニズムであり、ライセンス数は初期化時に指定され、スレッドが同時にアクセスできる保護されたリソースの数を示します。スレッドがリソースにアクセスしようとすると、ライセンスの取得を試行します。ライセンスが使用できない場合、ライセンスが使用可能になるまでスレッドはブロックされます。

Java 関数の同時実行性とマルチスレッドにおけるセマフォの役割は何ですか?

Java 関数の同時実行性とマルチスレッドにおけるセマフォの役割

セマフォは Java 同時プログラミングにおける重要なメカニズムであり、マルチスレッド シナリオでリソース アクセスを制御するために使用されます。これは、リソースを保護する共有データ構造のライセンスを作成することによって行われます。

仕組み

セマフォは初期化時にライセンス数を指定します。これは、保護されたリソースに同時にアクセスできるスレッドの最大数を示します。スレッドがリソースにアクセスしようとすると、セマフォ上のライセンスを取得しようとします。利用可能な場合、ライセンスが付与され、スレッドはリソースにアクセスできるようになります。使用可能なライセンスがない場合、ライセンスが使用可能になるまでスレッドはブロックされます。

実際的なケース

共有リソース、つまりキューがあると仮定します。キューに同時にアクセスできるスレッドは 5 つだけです。これを確実にするためにセマフォを使用できます:

import java.util.concurrent.Semaphore;
import java.util.Queue;

public class Example {
    private static final int MAX_ACCESS_COUNT = 5;
    private static Semaphore semaphore = new Semaphore(MAX_ACCESS_COUNT);
    private static Queue<Integer> queue = new ConcurrentLinkedQueue<>();

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> accessQueue()).start();
        }
    }

    private static void accessQueue() {
        try {
            // 尝试获取一个许可证
            semaphore.acquire();

            // 访问队列
            queue.add((int) (Math.random() * 100));

            // 释放许可证
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

この例では、セマフォは 5 つのライセンスで初期化されます。これにより、キューに同時にアクセスできるスレッドは最大 5 つだけになります。ライセンスが利用可能になるまで、他のスレッドはブロックされます。

結論

セマフォは、共有リソースへの同時アクセスを制御するのに非常に役立ちます。リソースに同時にアクセスできるスレッドの数を制限することで、データの競合や不整合を防ぐのに役立ちます。

以上がJava 関数の同時実行性とマルチスレッドにおけるセマフォの役割は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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