CyclicBarrier 和 CountDownLatch

举报
赵KK日常技术记录 发表于 2023/06/30 23:07:29 2023/06/30
【摘要】 CyclicBarrier 和 CountDownLatch 都是 Java 并发编程中的同步工具,用于协调多个线程之间的操作。但它们的实现方式和应用场景有所不同。CyclicBarrier 是一个可重用的同步屏障,它允许一组线程相互等待,直到所有线程都达到某个屏障点后才继续执行。CyclicBarrier 可以被重复使用,因为一旦所有线程都通过了屏障,它就会被重置为可用状态。CyclicB...

CyclicBarrier 和 CountDownLatch 都是 Java 并发编程中的同步工具,用于协调多个线程之间的操作。但它们的实现方式和应用场景有所不同。
CyclicBarrier 是一个可重用的同步屏障,它允许一组线程相互等待,直到所有线程都达到某个屏障点后才继续执行。CyclicBarrier 可以被重复使用,因为一旦所有线程都通过了屏障,它就会被重置为可用状态。CyclicBarrier 的主要应用场景是当一组线程需要相互等待,但它们之间的执行顺序不受限制时。例如,当多个线程需要对某个共享资源进行并发访问时,可以使用 CyclicBarrier 来确保它们之间的互斥性。
CountDownLatch 是一个计数同步器,它允许一个或多个线程等待其他线程完成操作。CountDownLatch 初始化时,计数器的值为指定的数值,每个线程调用 countDown() 方法时,计数器的值会递减。当计数器的值降为 0 时,线程会被阻塞,直到其他线程调用 countDown() 方法唤醒它们。CountDownLatch 的主要应用场景是当一个或多个线程需要等待其他线程完成某些操作时,例如在并发编程中,当一个线程需要等待其他线程完成某些任务后才能继续执行时,可以使用 CountDownLatch。
总的来说,CyclicBarrier 和 CountDownLatch 都是 Java 并发编程中的重要同步工具,但它们的实现方式和应用场景有所不同。在选择使用哪种同步工具时,需要根据具体的应用场景和需求来进行选择。
以下是 CyclicBarrier 和 CountDownLatch 的简单示例代码:
CyclicBarrier 示例代码:

import java.util.concurrent.CyclicBarrier;  
import java.util.concurrent.Semaphore;
public class CyclicBarrierExample {  
   public static void main(String[] args) {  
       int count = 5;  
       CyclicBarrier cyclicBarrier = new CyclicBarrier(count, new Runnable() {  
           @Override  
           public void run() {  
               System.out.println("线程 " + Thread.currentThread().getName() + " 完成任务");  
           }  
       });
       Semaphore semaphore = new Semaphore(count, count);
       for (int i = 0; i < count; i++) {  
           new Thread(new Runnable() {  
               @Override  
               public void run() {  
                   try {  
                       cyclicBarrier.await();  
                       semaphore.acquire();  
                       System.out.println("线程 " + Thread.currentThread().getName() + " 获取到 semaphore");  
                   } catch (InterruptedException e) {  
                       e.printStackTrace();  
                   }  
                   semaphore.release();  
                   System.out.println("线程 " + Thread.currentThread().getName() + " 释放 semaphore");  
               }  
           }).start();  
       }  
   }  
}

CountDownLatch 示例代码:

import java.util.concurrent.CountDownLatch;  
import java.util.concurrent.locks.ReentrantLock;
public class CountDownLatchExample {  
   private static final int COUNT = 5;  
   private static CountDownLatch countDownLatch = new CountDownLatch(COUNT);  
   private static ReentrantLock lock = new ReentrantLock();
   public static void main(String[] args) {  
       for (int i = 0; i < COUNT; i++) {  
           new Thread(new Runnable() {  
               @Override  
               public void run() {  
                   try {  
                       countDownLatch.await();  
                       lock.lock();  
                       System.out.println("线程 " + Thread.currentThread().getName() + " 获取到 countDownLatch");  
                   } catch (InterruptedException e) {  
                       e.printStackTrace();  
                   }  
                   lock.unlock();  
                   System.out.println("线程 " + Thread.currentThread().getName() + " 释放 countDownLatch");  
               }  
           }).start();  
       }  
   }  
}

以上代码分别展示了 CyclicBarrier 和 CountDownLatch 的用法。在 CyclicBarrier 示例中,我们创建了一个 CyclicBarrier 实例,并在其中的 Runnable 中执行任务。在 CountDownLatch 示例中,我们创建了一个 CountDownLatch 实例,并在其中的 Runnable 中执行任务。通过这两个示例,可以更好地理解 CyclicBarrier 和 CountDownLatch 的用法和区别。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。