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:我走了!

最新文章

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

热门文章

  1. python基础1习题练习
  2. requests抓取数据示例
  3. aws mysql 开启慢查询日志, 并利用mysqlsla 分析
  4. 使用Python实现批量ping操作
  5. Kafka的参数调优
  6. Android(H5)互相调用方法
  7. Coursera课程笔记----计算导论与C语言基础----Week 4
  8. 初探numpy
  9. ssh chroot 设置
  10. &amp;#128075;嗨,你有一份微信好友报告待查收~