首頁 > Java > java教程 > 項目 喜歡並發實用程式來等待和通知

項目 喜歡並發實用程式來等待和通知

DDD
發布: 2025-01-03 21:06:40
原創
1050 人瀏覽過

動機

  • 自 Java 5 以來,該平台在 java.util.concurrent 套件中提供了高級並發實用程式。
  • 它們取代了手動且複雜的等待和通知的使用。
  • 它們更安全、更易於使用,減少了並發程式碼中出錯的可能性。

java.util.concurrent 中的同時實用程式
實用類別:

  • 執行器框架:第 80 條中介紹的執行緒管理。
  • 並發集合:List、Queue 和 Map 等標準集合的執行緒安全實作。
  • 同步器:執行緒之間的協調,包括 CountDownLatch、Semaphore、CyclicBarrier、Exchanger 和 Phaser。

競賽系列

特徵:

  • 內部同步以獲得高效能。
  • 他們不允許排除競爭活動。
  • 像 putIfAbsent 這樣的原子操作提高了安全性和可用性。 範例:線程安全 Map 的實作:
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:在可重複使用屏障點進行同步。
  • Phaser:進階動態執行緒同步。

實際範例:使用 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(最終確定)。
  • 使用 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板