JUC并发工具--CyclicBarrier的使用和原理解析

CyclicBarrier和CountDownLatch一样是一种同步辅助工具

CyclicBarrier 它允许一组线程在一个共同的屏障点彼此等待,所有线程到达屏障点后再全部同时执行。固定数量的线程在程序中必须彼此等待的时候,CyclicBarrier非常有用

同CountDownLatch不同的是:

  1. CyclicBarrier的某个线程运行到某个点上之后,该线程即停止运行,直到所有的线程都到达了这个点,所有线程才重新运行;CountDownLatch则不是,某线程运行到某个点上之后,只是给某个数值-1而已,该线程继续运行
  2. CyclicBarrier只能唤起一个任务,CountDownLatch可以唤起多个任务
  3. CyclicBarrier可重用,CountDownLatch不可重用,计数值为0该CountDownLatch就不可再用了
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CyclicBarrier;


public class Person implements Runnable {
    private CyclicBarrier barrier;
    private String name;

    public Person(CyclicBarrier barrier, String name) {
        this.barrier = barrier;
        this.name = name;
    }

    @Override
    public void run() {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
            System.out.println(sdf.format(new Date()) + " " + name + "出发去饭店");
            System.out.println(sdf.format(new Date()) + " " + name + "到了饭店");

            barrier.await();

            System.out.println(sdf.format(new Date()) + " " + name + "开始吃饭");
            System.out.println(sdf.format(new Date()) + " " + name + "吃完了");
            // 重用CyclicBarrier
            barrier.await();

            System.out.println(sdf.format(new Date()) + " " + name + "离开餐厅");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) throws Exception {

        CyclicBarrier barrier = new CyclicBarrier(3);

        List<Thread> threads = new ArrayList<>(3);
        threads.add(new Thread(new Person(barrier, "张三")));
        threads.add(new Thread(new Person(barrier, "李四")));
        threads.add(new Thread(new Person(barrier, "王五")));

        for (Thread thread : threads) {
            thread.start();
        }

        //等待所有线程跑完
        for (Thread thread : threads) {
            thread.join();
        }
    }
    
经过测试:当使用 CyclicBarrier 和 不使用 CyclicBarrier

使用 CyclicBarrier:
17:31:42.395 张三出发去饭店
17:31:42.395 李四出发去饭店
17:31:42.396 张三到了饭店
17:31:42.395 王五出发去饭店
17:31:42.396 李四到了饭店
17:31:42.396 王五到了饭店
17:31:42.397 王五开始吃饭
17:31:42.397 张三开始吃饭
17:31:42.397 李四开始吃饭
17:31:42.397 张三吃完了
17:31:42.397 王五吃完了
17:31:42.397 李四吃完了
17:31:42.397 张三离开餐厅
17:31:42.397 李四离开餐厅
17:31:42.397 王五离开餐厅

不使用 CyclicBarrier:
17:27:36.764 张三出发去饭店
17:27:36.767 张三到了饭店
17:27:36.768 张三开始吃饭
17:27:36.768 张三吃完了
17:27:36.768 张三离开餐厅
17:27:36.764 王五出发去饭店
17:27:36.764 李四出发去饭店
17:27:36.769 李四到了饭店
17:27:36.769 李四开始吃饭
17:27:36.769 李四吃完了
17:27:36.769 李四离开餐厅
17:27:36.769 王五到了饭店
17:27:36.770 王五开始吃饭
17:27:36.770 王五吃完了
17:27:36.770 王五离开餐厅

原理:

  1. 在CyclicBarrier的内部定义了一个ReentrantLock的对象,然后再利用这个ReentrantLock对象生成一个Condition的对象
  2. 每当一个线程调用CyclicBarrier的await方法时,首先把剩余屏障的线程数减1
  3. 然后判断剩余屏障数是否为0:如果不是,利用Condition的await方法阻塞当前线
  4. 如果是,首先利用Condition的signalAll方法唤醒所有线程
  5. 最后重新生成Generation对象以实现屏障的循环使用

参考:
https://zhuanlan.zhihu.com/p/140324377?from_voters_page=true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本系统的研发具有重大的意义,在安全性方面,用户使用浏览器访问网站时,采用注册和密码等相关的保护措施,提高系统的可靠性,维护用户的个人信息和财产的安全。在方便性方面,促进了校园失物招领网站的信息化建设,极大的方便了相关的工作人员对校园失物招领网站信息进行管理。 本系统主要通过使用Java语言编码设计系统功能,MySQL数据库管理数据,AJAX技术设计简洁的、友好的网址页面,然后在IDEA开发平台中,编写相关的Java代码文件,接着通过连接语言完成与数据库的搭建工作,再通过平台提供的Tomcat插件完成信息的交互,最后在浏览器中打开系统网址便可使用本系统。本系统的使用角色可以被分为用户和管理员,用户具有注册、查看信息、留言信息等功能,管理员具有修改用户信息,发布寻物启事等功能。 管理员可以选择任一浏览器打开网址,输入信息无误后,以管理员的身份行使相关的管理权限。管理员可以通过选择失物招领管理,管理相关的失物招领信息记录,比如进行查看失物招领信息标题,修改失物招领信息来源等操作。管理员可以通过选择公告管理,管理相关的公告信息记录,比如进行查看公告详情,删除错误的公告信息,发布公告等操作。管理员可以通过选择公告类型管理,管理相关的公告类型信息,比如查看所有公告类型,删除无用公告类型,修改公告类型,添加公告类型等操作。寻物启事管理页面,此页面提供给管理员的功能有:新增寻物启事,修改寻物启事,删除寻物启事。物品类型管理页面,此页面提供给管理员的功能有:新增物品类型,修改物品类型,删除物品类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值