CountDownLatch(减少计数)

原理:

CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。
  其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),
  当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行

 代码: 题目:6个学生+班长在教室上自习,只有班长有钥匙锁门,班长只有等六个学生都走完才能锁门

package com.thekingqj;import java.util.concurrent.CountDownLatch;/*** CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。*   其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),*   当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。*  */
public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 0; i <6 ; i++) {final int temp=i;new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t"+temp+"离开教室");countDownLatch.countDown();}, String.valueOf(i)).start();}countDownLatch.await();System.out.println("班长离开教室");}
}

CyclicBarrier循环栅栏

原理:

字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,
  让一组线程到达一个屏障(也可以叫同步点)时被阻塞,
  直到最后一个线程到达屏障时,屏障才会开门,所有
  被屏障拦截的线程才会继续干活。
  线程进入屏障通过CyclicBarrier的await()方法。

样例:集齐七颗龙珠才能召唤神龙

package com.thekingqj;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;/***  * CyclicBarrier*  * 的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,*  * 让一组线程到达一个屏障(也可以叫同步点)时被阻塞,*  * 直到最后一个线程到达屏障时,屏障才会开门,所有*  * 被屏障拦截的线程才会继续干活。*  * 线程进入屏障通过CyclicBarrier的await()方法*/
public class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier barrier = new CyclicBarrier(7, () -> {System.out.println("*******召唤神龙");});for (int i = 1; i <=7 ; i++) {final int temp=i;new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t第"+temp+"个龙珠已经收集到");try {barrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}, String.valueOf(i)).start();}}
}

Semaphore信号灯

原理:

在信号量上我们定义两种操作:
  acquire(获取) 当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),
        要么一直等下去,直到有线程释放信号量,或超时。
  release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。
  信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。

非公平锁,意思就是可以耍流氓,谁抢到的算谁的。

代码:六部车抢三个车位

package com.thekingqj;import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;public class SemaphoreDemo {public static void main(String[] args) {Semaphore semaphore=new Semaphore(3);for (int i = 0; i <6 ; i++) {new Thread(() -> {boolean flag=false;try {semaphore.acquire();//获取信号量flag=true;System.out.println(Thread.currentThread().getName()+"\t"+"抢到车位");TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName()+"\t"+"离开车位");} catch (InterruptedException e) {e.printStackTrace();}finally {if(flag){semaphore.release();//释放当前信号量}}}, String.valueOf(i)).start();}}
}

JUC的常用辅助工具相关推荐

  1. 猿创征文|【开发工具-我打辅助的】2022软件开发常用辅助工具

    总览 常说工欲善其事必先利其器,人力终归有限,而软件开发又是一个相当耗费时间和经历的过程,而简捷的开发辅助工具则能够大大提高我们软件工程师的开发效率. 必关注网站 国家信息安全漏洞库 官网:https ...

  2. 多线程总结-JUC中常用的工具类

    本文只记录JUC中较常用到的一些工具类,只是列举其常见的使用方法,至于其实现原理,此处不做说明. CountDownLatch 一个同步工具类,允许一个或多个线程一直等待,直到其他线程运行完成后再执行 ...

  3. iOS 开发常用辅助工具

    工欲善其事,必先利其器.作为一个合格的iOS开发者,熟练的使用各种开发或辅助开发的工具也算是一项必备技能吧,下面是我整理的一些工具及其应用场景和使用方法. 文档浏览工具 - Dash 网络抓包工具 C ...

  4. 常用的自媒体工具有哪些?推荐4个常用辅助工具

    我们做自媒体运营,想要快速的创作内容,提供文章的创作速度是我们的目标,我们别的大佬可以很快地就创作出一篇内容,而自己墨迹半天确出不了一个字呢?其实这关乎到创作技巧,下面小编就跟大家分享如何利用自媒体工 ...

  5. 落地好OKR的8大关键步骤及常用辅助工具

    本篇文章将回答关于OKR的一些问题,比如:1.OKR是什么?2.OKR与KPI的本质区别:3.OKR实施的4步法与3大成功关键点:4.OKR 落地常用的5大管理软件:5.如何写好OKR,制定正确的OK ...

  6. 【工具总结】前端常用辅助工具

    1.马克鳗 http://www.getmarkman.com/#/download-modal 设计稿标注,测量 2.CSS精灵 https://www.toptal.com/developers/ ...

  7. .NET 程序员十种常用辅助开发工具

     .NET 程序员十种常用辅助开发工具      一: .NET 程序员十种工具 - Visual Studio Converter(转换器工具) Visual Studio .NET 项目转换器(参 ...

  8. 数据库学习笔记第三弹——MySQL常用的图形化管理辅助工具及相关问题(图文详解2022))

    数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 文章目录 数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 1.MySQL常用的图形化管理 ...

  9. 社群运营中常用的辅助工具,口碑推荐这几款!

    职场生活很残酷,大鱼吃小鱼,小鱼吃虾米,虾米卷铺盖走人,没有扎实的实力往往很容易被淘汰,所以作为每一个职场同学,要提高工作效率就得借助一些辅助工具,让复杂的事情简单化,简单的事情更加便捷化. 那么社群 ...

  10. 推荐个人常用的六个APP设计辅助工具

    推荐个人常用的六个APP设计辅助工具 分享六个本人在学习和制作App设计时,经常使用到的辅助工具,非常实用,相信对UI设计的初学者一定非常有帮助. Eagle Eagle for mac 一个简单.高 ...

最新文章

  1. node建立博客系统遇到的问题,1,乱码。2,multer的使用错误。3使用session问题...
  2. ML近三年在CVPR比较流行被应用的技术有哪些?
  3. Google Maps API v2 android版本开发 国内手机不支持google play Service相关问题解决--图文教程
  4. 皮一皮:我是谁,我在哪里,我的爸爸是哪个?
  5. Cuda中Global memory中coalescing例程解释
  6. python中的format方法和int方法
  7. JavaScript中的String substring()方法和示例
  8. 【java】dubbo基础学习
  9. 关于 Hibernate 中的“脏数据”、“脏对象”
  10. python123安装教程_小白安装Python环境详细步骤!
  11. JAVA-上转型对象,下转型对象
  12. lua collectgarbage
  13. mysql清空数据库_mysql命令行快速清空数据库的方法
  14. 基于遗传算法的新安江模型参数优化率定(二)
  15. govendor使用及错误处理
  16. ios键盘遮挡输入框问题
  17. 微信屏蔽网址解决办法 怎么样才能让被微信屏蔽的网址正常访问
  18. 佐治亚大学计算机博士,美国佐治亚大学,光电专业,全奖博士招生
  19. 头文件里应该写些什么
  20. Cannot interpret feed_dict key as Tensor: Tensor Tensor(“keras_learning_phase:0“, shape=(),

热门文章

  1. 网络性能应用检测系统
  2. 罗永浩以为×××短信给了马化腾一记暴击,实际……
  3. GTK使用cairo绘图教程
  4. mysql远程备份_mysql实现自动远程备份一办法
  5. ASP.NET Core 中文文档目录
  6. 如何关闭谷歌浏览器Google Chrome的阅读清单功能
  7. OpenAI 开源语音识别 Whisper
  8. 设计符合人需求层次模型的商业模式——揭密冰桶挑战背后,不为人知的商业秘密!
  9. Opencvchina网站:把证件照蓝色背景转为白色
  10. 是时候关注邮件安全了