首页 > 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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板