【JUC】CyclicBarrier和Semaphore的使用
CyclicBarrier的使用
CyclicBarrier:可以让一组检测到一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有的屏障拦截的线程才会继续执行,线程进入屏障通过CyclicBarrier的wait方法。
public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5,()->{
System.out.println("五个线程都到了,一起输出");
});
for (int i = 0; i < 5; i++) {
//这里如果不用final修饰,那么主线程结束的时候某个其他线程还在等待
// 但是tmp的生命周期已经结束,为了避免这种情况发生,要用final修饰
final int tmp = i;
new Thread(()->{
System.out.println(Thread.currentThread().getName()+ "-线程到了:" + tmp);
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}
输出结果
0-线程到了:0
4-线程到了:4
2-线程到了:2
1-线程到了:1
3-线程到了:3
五个线程都到了,一起输出
Semaphore的使用
Semaphore可以替代synchronizated(信号量设为1)和Lock
信号量的两个作用:1. 多个共享资源的互斥使用 2. 并发线程数的控制
第一个构造方法默认非公平锁
非公平锁:一上来就抢占资源,允许线程加塞。在高并发的情况下,可能会造成优先级反转或饥饿现象。它会直接尝试占有锁,尝试失败的话再采用公平锁的方式。非公平锁的优点是吞吐量大。
公平锁:多个线程按照申请锁的顺序来获取,先来先得。
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit; /**
* 多对多的抢占资源
*/
public class SemaphoreDemo {
public static void main(String[] args) {
//3个停车位
Semaphore position = new Semaphore(3);
//6辆车想要停车
for (int i = 0; i < 6; i++) {
new Thread(()->{
try {
position.acquire();//抢到一张门票
System.out.println("张"+Thread.currentThread().getName()+":我抢到车位了!");
TimeUnit.SECONDS.sleep(1);//保安维持秩序 等待下一轮抢票
System.out.println("张"+Thread.currentThread().getName()+":我走了!");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
position.release();//释放车位
}
},String.valueOf(i)).start();
}
}
}
输出结果:
张0:我抢到车位了!
张2:我抢到车位了!
张1:我抢到车位了!
张0:我走了!
张1:我走了!
张3:我抢到车位了!
张2:我走了!
张4:我抢到车位了!
张5:我抢到车位了!
张5:我走了!
张3:我走了!
张4:我走了!
【JUC】CyclicBarrier和Semaphore的使用的更多相关文章
- 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore
前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...
- JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore
在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...
- Java并发之CountDownLatch、CyclicBarrier和Semaphore
CountDownLatch 是能使一组线程等另一组线程都跑完了再继续跑:CyclicBarrier 能够使一组线程在一个时间点上达到同步,可以是一起开始执行全部任务或者一部分任务. CountDow ...
- Java中的并发工具类:CountDownLatch、CyclicBarrier和Semaphore
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 一. ...
- Java并发包5--同步工具CountDownLatch、CyclicBarrier、Semaphore的实现原理解析
前言: JUC中提供了很多同步工具类,比如CountDownLatch.CyclicBarrier.Semaphore等,都可以作用同步手段来实现多线程之间的同步效果 一.CountDownLatch ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- 并发工具类:CountDownLatch、CyclicBarrier、Semaphore
在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...
- Java并发(8):CountDownLatch、CyclicBarrier、Semaphore、Callable、Future
CountDownLatch.CyclicBarrier.Semaphore.Callable.Future 都位于java.util.concurrent包下,其中CountDownLatch.C ...
- CountDownLatch、CyclicBarrier和Semaphore
转载:http://www.cnblogs.com/dolphin0520/p/3920397.html 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDown ...
- 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...
随机推荐
- 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 K题 center
You are given a point set with nn points on the 2D-plane, your task is to find the smallest number o ...
- Spring MVC的Controller接受请求方式以及编写请求处理方法
Controller接受请求参数的常见方法: 1.通过Bean接受请求参数: 创建POJO实体类 创建pojo包,并在该包中创建实体类UserForm,代码: package pojo; public ...
- C# 9.0 新特性预览 - 类型推导的 new
C# 9.0 新特性预览 - 类型推导的 new 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大 ...
- 【x64软路由】OpenWrt(LEDE) 20200329编译 反追踪 抗污染 加速 PSW 无缝集成 UPnP NAS
固件说明 基于Lede OpenWrt R2020.3.19版本(源码更新截止20200329)Lienol Feed及若干自行维护的软件包 结合家庭x86软路由场景需要定制 按照家庭应用场景对固件及 ...
- OpenWrt R2020.3.11 去广告 抗污染 加速 PSW 无缝集成 UnPnP NAS
近期更新:OpenWrt R2020.3.11版本2020.03.16编译. 按大家要求,新发布固件携带了编译时用到的全部软件包 加入了国内域名加速解析脚本 解决了原去广告,DNS优化方案与PSW冲突 ...
- ARM-Linux Gcc 交叉编译环境搭建
1 NFS网络文件系统搭建 测试宿主机与目标板ping通 目标板上某个文件夹(例如mnt)挂载到宿主机(192.168.1.111)的/home/nfs_dir文件夹下 mount –t nfs –o ...
- Python拆分一列为多列
有的员工,没有公司开户行的银行卡,发放现金工资.有时人多,需要计算币数.现金工资表中,其中一列为实发工资,import pandas as pd,转化为pd.DataFrame. 面值[100,50, ...
- [c++ IO加速]快速输入输出
自己封装的FastIO类,效率虽有所损失,不过实用性提高很多. 测试,写10000000个整数(86M): printf 2.7s cout 27s FastIO 1s 测试,读10000000个整数 ...
- [hdu4609]计数方法,FFT
题目:给一个数组a,从里面任选三个数,求以这三个数为三条边能构成三角形的概率. 思路:由于每个数只能用一次,所以考虑枚举三边中的最大边.先将a数组排序,然后枚举它的每个数x作为最大边,那么问题就是要求 ...