CyclicBarrier的使用

CyclicBarrier:可以让一组检测到一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有的屏障拦截的线程才会继续执行,线程进入屏障通过CyclicBarrier的wait方法。

  1. public class CyclicBarrierTest {
  2. public static void main(String[] args) {
  3. CyclicBarrier cyclicBarrier = new CyclicBarrier(5,()->{
  4. System.out.println("五个线程都到了,一起输出");
  5. });
  6. for (int i = 0; i < 5; i++) {
  7. //这里如果不用final修饰,那么主线程结束的时候某个其他线程还在等待
  8. // 但是tmp的生命周期已经结束,为了避免这种情况发生,要用final修饰
  9. final int tmp = i;
  10. new Thread(()->{
  11. System.out.println(Thread.currentThread().getName()+ "-线程到了:" + tmp);
  12. try {
  13. cyclicBarrier.await();
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. } catch (BrokenBarrierException e) {
  17. e.printStackTrace();
  18. }
  19. },String.valueOf(i)).start();
  20. }
  21. }
  22. }

输出结果

  1. 0-线程到了:0
  2. 4-线程到了:4
  3. 2-线程到了:2
  4. 1-线程到了:1
  5. 3-线程到了:3
  6. 五个线程都到了,一起输出

Semaphore的使用

Semaphore可以替代synchronizated(信号量设为1)和Lock

信号量的两个作用:1. 多个共享资源的互斥使用 2. 并发线程数的控制

第一个构造方法默认非公平锁

非公平锁:一上来就抢占资源,允许线程加塞。在高并发的情况下,可能会造成优先级反转或饥饿现象。它会直接尝试占有锁,尝试失败的话再采用公平锁的方式。非公平锁的优点是吞吐量大。

公平锁:多个线程按照申请锁的顺序来获取,先来先得。

  1. import java.util.concurrent.Semaphore;
  2. import java.util.concurrent.TimeUnit;
  3.  
  4. /**
  5. * 多对多的抢占资源
  6. */
  7. public class SemaphoreDemo {
  8. public static void main(String[] args) {
  9. //3个停车位
  10. Semaphore position = new Semaphore(3);
  11. //6辆车想要停车
  12. for (int i = 0; i < 6; i++) {
  13. new Thread(()->{
  14. try {
  15. position.acquire();//抢到一张门票
  16. System.out.println("张"+Thread.currentThread().getName()+":我抢到车位了!");
  17. TimeUnit.SECONDS.sleep(1);//保安维持秩序 等待下一轮抢票
  18. System.out.println("张"+Thread.currentThread().getName()+":我走了!");
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. } finally {
  22. position.release();//释放车位
  23. }
  24. },String.valueOf(i)).start();
  25. }
  26. }
  27. }

输出结果:

  1. 0:我抢到车位了!
  2. 2:我抢到车位了!
  3. 1:我抢到车位了!
  4. 0:我走了!
  5. 1:我走了!
  6. 3:我抢到车位了!
  7. 2:我走了!
  8. 4:我抢到车位了!
  9. 5:我抢到车位了!
  10. 5:我走了!
  11. 3:我走了!
  12. 4:我走了!

【JUC】CyclicBarrier和Semaphore的使用的更多相关文章

  1. 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore

    前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...

  2. JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore

    在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...

  3. Java并发之CountDownLatch、CyclicBarrier和Semaphore

    CountDownLatch 是能使一组线程等另一组线程都跑完了再继续跑:CyclicBarrier 能够使一组线程在一个时间点上达到同步,可以是一起开始执行全部任务或者一部分任务. CountDow ...

  4. Java中的并发工具类:CountDownLatch、CyclicBarrier和Semaphore

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 一. ...

  5. Java并发包5--同步工具CountDownLatch、CyclicBarrier、Semaphore的实现原理解析

    前言: JUC中提供了很多同步工具类,比如CountDownLatch.CyclicBarrier.Semaphore等,都可以作用同步手段来实现多线程之间的同步效果 一.CountDownLatch ...

  6. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  7. 并发工具类:CountDownLatch、CyclicBarrier、Semaphore

    在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...

  8. Java并发(8):CountDownLatch、CyclicBarrier、Semaphore、Callable、Future

    CountDownLatch.CyclicBarrier.Semaphore.Callable.Future  都位于java.util.concurrent包下,其中CountDownLatch.C ...

  9. CountDownLatch、CyclicBarrier和Semaphore

    转载:http://www.cnblogs.com/dolphin0520/p/3920397.html 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDown ...

  10. 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...

随机推荐

  1. bfs—迷宫问题—poj3984

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20591   Accepted: 12050 http://poj ...

  2. opencv-11-中值滤波及自适应中值滤波

    开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降, 但是总体来说, 我们得到的结果能够说明我们的算法执行 ...

  3. 使用Python实现批量ping操作

    在日常的工作中,我们通常会有去探测目标主机是否存活的应用场景,单个的服务器主机可以通过计算机自带的DOS命令来执行,但是业务的存在往往不是单个存在的,通常都是需要去探测C段的主机(同一个网段下的存活主 ...

  4. awk调用date命令

    创建文件date.awk: $ == { cmd = "\"" while (cmd | getline line) { print line } close(cmd) ...

  5. POI问题总结,关于数字级联及多级级联(三级以上)

    目录 最近公司业务需要用到excel,并且要导出模板,今天为止所有的功能都已经实现了,在这里对出现的一些问题做一个总结. 效果图: 这是一个五级联动的数据,其中第一列是数字开头,实现了五级联动 问题1 ...

  6. rsync客户端一键安装rsync脚本(源码)

    客户端 read -np "请输入源码rsync的URL 地址 包名(以空格为分隔符,别带/):" URL DZ BM yum remove -y rsync &>& ...

  7. Spring 中基于 AOP 的 @AspectJ注解实例

    @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格.通过在你的基于架构的 XML 配置文件中包含以下元素,@AspectJ 支持是可用的 ...

  8. Openwrt:添加"自定义软件包.ipk"

    我们已经尝试做的一件事情,是让移植软件到OpenWrt的操作变得非常容易.如果打开OpenWrt里的一个软件包的目录(OpenWrt/Package/* 或 OpenWrt/feeds/package ...

  9. 放大镜功能 JS原生写法

    ********** 希望对大家帮助 我会继续努力的 如果有不对的地方请大家帮忙指出****** 1 [JS 代码] <script> var oBox = document.getEle ...

  10. python 数据类型: 字符串String / 列表List / 元组Tuple / 集合Set / 字典Dictionary

    #python中标准数据类型 字符串String 列表List 元组Tuple 集合Set 字典Dictionary 铭记:变量无类型,对象有类型 #单个变量赋值 countn00 = '; #整数 ...