【JUC】CyclicBarrier和Semaphore的使用
2024-09-03 09:08:31
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:我走了!
最新文章
- 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd
- python 利用 setup.py 手动安装django_chartit
- Java笔记9-正则表达式
- 兼容IE,chrome 等所有浏览器 回到顶部代码
- oracle 之 内存—鞭辟近里(二)
- js实现谷歌坐标转百度坐标
- Dalvik和ART
- HDOJ-2039
- lua的面向对象
- C# → 数据库
- c——根据天数输出日期
- php文件缓存方法总结
- python的回调callback
- Js_闭包跟作用域
- Sql Server 2016 Always On集群搭建
- Apache 配置多个HTTPS站点
- BatchNormalization批量归一化
- C++STL 中的容器整体/逐元素操作方法 少写80%for循环
- @ControllerAdvice + @ExceptionHandler 处理 全部Controller层异常
- dp_c_区间dp_g