ホームページ >Java >&#&チュートリアル >項目 待機および通知する同時実行ユーティリティを優先する

項目 待機および通知する同時実行ユーティリティを優先する

DDD
DDDオリジナル
2025-01-03 21:06:401028ブラウズ

モチベーション

  • Java 5 以降、プラットフォームは java.util.concurrent パッケージで高レベルの同時実行ユーティリティを提供してきました。
  • これらは、手動での待機と通知の複雑な使用を置き換えます。
  • これらはより安全で使いやすく、同時コードでのエラーの可能性が減少します。

java.util.concurrent の同時実行ユーティリティ
ユーティリティ カテゴリ:

  • Executor Framework: スレッド管理は項目 80 で説明されています。
  • 同時コレクション: List、Queue、Map などの標準コレクションのスレッドセーフな実装。
  • シンクロナイザー: CountDownLatch、Semaphore、CyclicBarrier、Exchanger、Phaser などのスレッド間の調整。

競合コレクション

機能:

  • 内部同期により高いパフォーマンスを実現します。
  • 競合する活動の排除は許可されていません。
  • putIfAbsent のようなアトミック操作により、セキュリティと使いやすさが向上します。 例: スレッドセーフなマップの実装:
Map<String, String> map = new ConcurrentHashMap<>();
String result = map.putIfAbsent("key", "value");
if (result == null) {
    System.out.println("Valor inserido.");
} else {
    System.out.println("Chave já existente com valor: " + result);
}

利点:

  • 同期されたコレクション (Collections.synchronizedMap) を置き換えます。
  • 競合アプリケーションのパフォーマンスが大幅に向上しました。

シンクロナイザー
目的: スレッド間の調整。

一般的なシンクロナイザーの例:

  • CountDownLatch: スレッド調整用の使い捨てバリア。
  • セマフォ: 共有リソースへのアクセスを制御します。
  • CyclicBarrier: 再利用可能なバリア ポイントでの同期。
  • フェイザー: 高度で動的なスレッド同期。

実践例: CountDownLatch を使用した同時タイミング
目的: 複数のスレッドの実行時間を同時に測定します。

実装:

public static long time(Executor executor, int concurrency, Runnable action) throws InterruptedException {
    CountDownLatch ready = new CountDownLatch(concurrency);
    CountDownLatch start = new CountDownLatch(1);
    CountDownLatch done = new CountDownLatch(concurrency);

    for (int i = 0; i < concurrency; i++) {
        executor.execute(() -> {
            try {
                ready.countDown(); // Indica que está pronto
                start.await();     // Aguarda o sinal de início
                action.run();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } finally {
                done.countDown(); // Indica que terminou
            }
        });
    }

    ready.await();   // Aguarda todas as threads ficarem prontas
    long startTime = System.nanoTime();
    start.countDown(); // Dispara o sinal de início
    done.await();     // Aguarda todas as threads finalizarem
    return System.nanoTime() - startTime;
}

メモ:

  • ready (準備完了を示す)、start (初期トリガー)、done (終了) の 3 つのラッチを使用します。
  • System.nanoTime を使用して時間間隔を正確に測定します。

待機と通知による現在の実践
従来のコードのメンテナンスにのみ必要です。
主なルール:

  1. wait を呼び出すときは常にループを使用します。
synchronized (lock) {
    while (!condition) {
        lock.wait();
    }
}

  1. 待機の前後で状態をテストします。
  2. notify への依存を避け、notifyAll を優先します。

結論

  • 可能な限り競合するユーティリティを使用してください。
  • コードをより読みやすく、安全かつ効率的にします。
  • 最新の代替手段 (CyclicBarrier や Phaser など) は、待機および通知ベースのパターンを置き換えることができます

本の例

Item  Prefira os utilitários de concorrência ao wait e notify

Item  Prefira os utilitários de concorrência ao wait e notify

Item  Prefira os utilitários de concorrência ao wait e notify

Item  Prefira os utilitários de concorrência ao wait e notify

以上が項目 待機および通知する同時実行ユーティリティを優先するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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