闭锁:CountDownLatch

使用场景

当前线程需要等待若干条线程执行完毕后,才能继续执行的情况。

也可以是若干个步骤执行完毕后的情况。

使用方法

初始化闭锁的时候,填入计数值,然后等待其他线程或者步骤对计数值进行操作减减。当计数值变为0的时候,线程就会从闭锁的await()方法处继续执行。

不能将计数值的参数设置为0,因为这样就毫无意义。

使用示例

// 初始化闭锁,并设置资源个数
CountDownLatch c = new CountDownLatch(2); Thread t1 = new Thread( new Runnable(){
public void run(){
// 加载资源1
loadSomething();
// 本资源加载完后,计数值-1
c.countDown();
}
} ).start(); Thread t2 = new Thread( new Runnable(){
public void run(){
// 加载资源2
loadSomething();
// 本资源加载完后,计数值-1
c.countDown();
}
} ).start(); Thread t3 = new Thread( new Runnable(){
public void run(){
// 线程阻塞,等待计数值为0
c.await();
// 当闭锁计数值为0时,await返回,执行接下来的任务
dosomething();
}
} ).start();

同步屏障:CyclicBarrier

作用

让一组线程中的每一个线程达到一个位置的时候被阻塞,直到最后一个线程到达屏障,所有被阻塞的线程继续运行。

与闭锁的区别

  • 闭锁只能阻塞一个线程,目的是为了让当个线程满足某种条件。
  • 同步屏障可以满足多个线程同时阻塞,并同时继续执行。

使用方法

在实例化同步屏障的时候,填入线程等待个数,当等待的线程数满足这个数值要求,同步屏障才会释放。

使用示例

// 实例化对象,填入需要等待的线程数和屏障开启的任务
CyclicBarrier barrier = new CyclicBarrier(10, new Runnable(){
public void run(){
//当所有线程准备完毕后触发此任务
}
}); // 启动10条线程
for( int i=0; i < 10; i++ ) {
new Thread( new Runnable() {
public void run() {
// 等待,(同步屏障数量-1,直到为0时,打开屏障)
barrier.await(); dosomething();
}
} ).start();
}

信号量:

作用

可以控制访问特定资源的线程数量。

使用方法

示例化对象的时候,填入最大可访问的线程数量。在获取资源之前,调用acquire,获取完毕之后,调用release。

使用示例

// 实例化信号量对象,设置最大访问线程参数为5
Semaphore semaphore = new Semaphore(5); // 启动 10条线程
for ( int i=0; i < 10; i++ ) {
new Thread( new Runnbale(){
public void run(){
// 获取资源,若此时资源数值为0,则阻塞,当资源数大于0,则继续执行
semaphore.acquire();
// 任务代码
soSomething();
// 释放资源
semaphore.release();
}
} ).start();
}

Java并发编程的艺术(九)——闭锁、同步屏障和信号量的更多相关文章

  1. Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解

    1. 闭锁:CountDownLatch 1.1 使用场景 若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁. 1.2 代码实现 // 初始化闭锁,并设 ...

  2. Java并发编程的艺术(九)——批量获取多条线程的执行结果

    当向线程池提交callable任务后,我们可能需要一次性获取所有返回结果,有三种处理方法. 方法一:自己维护返回结果 // 创建一个线程池 ExecutorService executorServic ...

  3. 读《Java并发编程的艺术》(一)

    离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...

  4. Java并发编程的艺术读书笔记(2)-并发编程模型

    title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...

  5. Java并发编程的艺术(六)——线程间的通信

    多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...

  6. Java并发编程的艺术(三)——volatile

    1. 并发编程的两个关键问题 并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行:但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信 ...

  7. 《Java并发编程的艺术》留给自己以后看的笔记

    <Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. ...

  8. Java并发编程的艺术,解读并发编程的优缺点

    并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升. 在特殊的业务场景下先天的就适合于并发编程. 比如在 ...

  9. 读书笔记之《Java 并发编程的艺术》

    一.多线程语义 即使是单核处理器也支持多线程执行代码,CPU 通过给每个线程分配 CPU 时间片来执行任务,当前任务执行一个时间片后会切换到下一个任务,所以 CPU 通过不停的切换线程执行. 并发执行 ...

  10. java并发编程笔记(九)——多线程并发最佳实践

    java并发编程笔记(九)--多线程并发最佳实践 使用本地变量 使用不可变类 最小化锁的作用域范围 使用线程池Executor,而不是直接new Thread执行 宁可使用同步也不要使用线程的wait ...

随机推荐

  1. 转载 Web前端开发 HTML设计 经验与技巧总结

    文章目录1.限制input 输入框只能输入纯数字.限制长度.默认显示文字2.input输入框自动获取焦点3.用CSS让背景有透明度文字不变4.a标签禁止点击5.文字两种居中对齐6.设置一个元素一直在页 ...

  2. LeetCode 中等题解(4)

    40 组合总和 II Question 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates ...

  3. unity 顶点弹性网格效果

    1.球衰减 首先,我们将处理球衰减,鼠标或手指点中网格的点是碰撞点,越往外它所受的影响越小.我们需要从CPU中获取"_ImpactPos"这个碰撞点,获取摄像机和碰撞点的矢量,我们 ...

  4. sqlilab less28 less28a

    less-28  less-28a 二者相差不大 单引号小括号包裹,黑名单过滤--,#,空格,union空格select(不区分大小写) less-28的黑名单 less-28a的黑名单 %a0,不被 ...

  5. 深度分析:Java中如何如理异常,一篇帮你搞定!

    异常的背景 初识异常 我们曾经的代码中已经接触了一些 "异常" 了. 例如: 除以 0 System.out.println(10 / 0); // 执行结果 Exception ...

  6. java大厂面经-阿里腾讯、网易美团、京东、华为、快手、字节全在这里了

    前言 在这篇文章详细说了该如何去复习,之前也答应各位把面经整理一下,但是因为入职的事情耽搁了,现在整理出来回馈给大家! 美团 一面 0.自我介绍1.问项目(项目详细介绍.用到什么技术.有什么优化)2. ...

  7. 修改pycharm中的flask项目名遇到的坑

    曾修改过自己的项目名,并在settings中的解释器也更正过来了.然后执行pip list 报错: failed to create process. 解决方法如下: 到你的项目的venv目录下的Sc ...

  8. VMW14.x虚拟机安装Mac10.13系统教程

    之前虚拟机安装Mac经常出问题,所以这次又重新安装Mac,为了加深映像和之后回忆方便,特写下此次安装教程. 一 工具的准备: 首先准备教程的软件和包 1,虚拟机VMW    下载地址:https:// ...

  9. mysql-查询不同列的数量合计

    车辆违规信息表testmodel_test 表结构: 表字段:cra_id(车牌号),if_weigui(该次行驶是否违规,0是正常,1是违规) 目的: 查询表中共有几辆车,违规的有几辆车: 方法1 ...

  10. TeXstudio 2020显示行号(与之前的版本位置不太一样)