一、 CountDownLatch

概念

CountDownLatch是一个同步工具类,它允许一个或多个线程等待其他线程一系列操作的完成

CountDownLatch初始化必须给定一个int类型参数count,来表示事件总数。

CountDownLatch提供的主要方法:

方法 说明
await() 使当前线程进入同步队列进行等待,直到latch的值被减到0或者当前线程被中断,当前线程就会被唤醒
await(long timeout, TimeUnit unit) 带超时时间的await()
countDown() 使latch的值减1),如果减到了0,则会唤醒所有等待在这个latch上的线程
getCount() 获得latch的数值

使用场景:

  1. 高并发并行执行(让多个线程等待)
  2. 异步执行后回到业务主线程(让一个线程等待)(推荐)
1. 高并发并行执行
public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(1);for (int i = 1; i <= 3; i++) {new Thread(() -> {System.out.println("短跑运动员" + Thread.currentThread().getName() + "准备好了");try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("短跑运动员" + Thread.currentThread().getName() + "开始奔跑");}, String.valueOf(i)).start();}System.out.println("短跑运动员们进场");Thread.sleep(1000); //睡眠1秒,保证所有子线程创建完毕都进入run方法,执行await()方法countDownLatch.countDown();System.out.println("各就位");System.out.println("预备");System.out.println("鸣枪");
}
短跑运动员们进场
短跑运动员1准备好了
短跑运动员2准备好了
短跑运动员3准备好了
各就位
预备
鸣枪
短跑运动员2开始奔跑
短跑运动员3开始奔跑
短跑运动员1开始奔跑
2. 异步执行后回到业务主线程(推荐)
public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(3);System.out.println("业务开始分发各个子流程进行处理");for (int i = 1; i <= 3; i++) {new Thread(() -> {System.out.println("业务分支流程" + Thread.currentThread().getName() + "开始处理");countDownLatch.countDown();System.out.println("业务分支流程" + Thread.currentThread().getName() + "处理完成");}, String.valueOf(i)).start();}countDownLatch.await();System.out.println("业务处理结果汇总进行后续处理");
}
业务开始分发各个子流程进行处理
业务分支流程1开始处理
业务分支流程2开始处理
业务分支流程2处理完成
业务分支流程1处理完成
业务分支流程3开始处理
业务分支流程3处理完成
业务处理结果汇总进行后续处理

二、 CyclicBarrier

概念

CyclicBarrier同步工具类,循环屏障,通过它可以让一组线程等待至某个屏障(同步点)之后再全部同步执行。所有线程被释放之后,CyclicBarrierr可以被重新利用

CountDownLatch初始化必须给定一个int类型参数parties,来表示参与屏障等待的线程的总个数。

public static void main(String[] args) {CyclicBarrier cb = new CyclicBarrier(3, ()->{System.out.println("匹配完成");});System.out.println("游戏开始匹配……");for (int i = 0; i < 7; i++) {new Thread(() -> {boolean target = true;System.out.println("玩家" + Thread.currentThread().getName() + "开始匹配");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}try {cb.await(3, TimeUnit.SECONDS);} catch (Exception e) {target = false;System.out.println("玩家" + Thread.currentThread().getName() + "匹配失败,请重新匹配");} finally {if (target) {System.out.println("玩家" + Thread.currentThread().getName() + "匹配成功,开始游戏");}  }}, String.valueOf(i)).start();}}
游戏开始匹配……
玩家0开始匹配
玩家1开始匹配
玩家2开始匹配
玩家3开始匹配
玩家4开始匹配
玩家5开始匹配
玩家6开始匹配
匹配完成
玩家4匹配成功,开始游戏
玩家5匹配成功,开始游戏
玩家6匹配成功,开始游戏
匹配完成
玩家1匹配成功,开始游戏
玩家3匹配成功,开始游戏
玩家2匹配成功,开始游戏
玩家0匹配失败,请重新匹配

三、 Semaphore

概念

Semaphore信号量,多线程并发控制工具,可以控制同时访问共享资源的线程个数

CountDownLatch初始化必须给定一个int类型参数permits,来表示可以控制同时访问共享资源的线程个数。
CountDownLatch提供的主要方法:

方法 说明
acquire() 获取一个资源许可,如果没有获取到则阻塞
release() 释放一个资源许可
availablePermits() 剩余可获取许可数量
public static void main(String[] args) {Semaphore semaphore = new Semaphore(3);for (int i = 0; i < 5; i++) {new Thread(() -> {try {System.out.println(Thread.currentThread().getName() + "来到停车场");if (semaphore.availablePermits() == 0) {System.out.println("车位不足,请耐心等待");}semaphore.acquire();System.out.println(Thread.currentThread().getName() + "成功进入停车场并停好车");Thread.sleep(new Random().nextInt(2000));System.out.println(Thread.currentThread().getName() + "驶出停车场");semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}, i + "号车").start();}
}
0号车来到停车场
0号车成功进入停车场并停好车
1号车来到停车场
1号车成功进入停车场并停好车
2号车来到停车场
2号车成功进入停车场并停好车
4号车来到停车场
车位不足,请耐心等待
3号车来到停车场
车位不足,请耐心等待
1号车驶出停车场
4号车成功进入停车场并停好车
2号车驶出停车场
3号车成功进入停车场并停好车
0号车驶出停车场
3号车驶出停车场
4号车驶出停车场

JAVA多线程同步计数器相关推荐

  1. Android 价值千万java多线程同步 lt;五CountDownLatch(计数器)和Semaphore(信号量)

    1).Android 价值千万   java线程专题:Wait&notify&join&Yield http://blog.csdn.net/whb20081815/artic ...

  2. Java多线程同步机制

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...

  3. java 什么是线程同步,java多线程同步集合是什么?并发集合是什么?

    java中关于集合的内容也是十分丰富的,而且相关的知识点也是十分多的.多线程集合所涵盖的范围是十分广阔的.今天就来为大家介绍一下,java多线程同步集合是什么以及并发集合是什么?一起来看看吧. 首先我 ...

  4. java多线程同步与死锁_浅析Java多线程中的同步和死锁

    Value Engineering 1基于Java的多线程 多线程是实现并发机制的一种有效手段,它允许编程语言在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立,且与进程一样拥有独立 ...

  5. Java多线程同步之使用Lock实现车辆入库出库管理

    Java多线程同步之使用Lock实现车辆入库出库管理 个人笔记: 实现:车库有n个车位,现在有m辆车试图进入车库,每辆车停留随机秒数后离开 首先创建一个Garage车库类,Garage有空间属性和最大 ...

  6. java多线程同步5种方法

    一.引言 前几天面试,被大师虐残了,好多基础知识必须得重新拿起来啊.闲话不多说,进入正题. 二.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会 ...

  7. (转) Java多线程同步与异步

    Java线程 同步与异步 线程池 1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成 ...

  8. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  9. java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...

最新文章

  1. cannot find package “github.com/coreos/go-systemd/journal”
  2. 参加微软新技术预览大会
  3. SQL语言包含4个部分
  4. python运输问题_叶片运输优化问题学习笔记
  5. java代码编写出现的陷阱-1:警惕变长参数
  6. 【10】jQuery学习——入门jQuery选择器之表单选择器
  7. HAO3GP整站源码学生当时就蒙了
  8. 最小的JAVA WEB SERVER源程序 可正常運行
  9. 搞懂webdriver的底层原理,才敢说自己懂自动化!
  10. SMTP Error: Could not connect to SMTP host.
  11. linux根目录9个g,linux根目录下5个主要的目录,及目录的功能
  12. WIN7 VC2008 express 安装问题及其创建第一个cpp文件
  13. java中word转pdf实现
  14. Sign in - CodeProject
  15. c实现一个简单的线性反馈移位寄存器LFSR
  16. MATLAB和C语言的区别
  17. html时间格式转换,时间格式转换
  18. 苹果id登录_英雄联盟手游是用苹果ID好还是拳头好 账号选择建议_英雄联盟手游...
  19. html调用网易云播放器无法自动播放,网页内嵌网易云插件全程(包括生成自己歌单的外链)...
  20. 让鼠标漫天飞舞:在内核中实现鼠标的中断处理

热门文章

  1. 【设计】Adobe Xd 简明教程 对比 Sketch
  2. 混合高斯背景建模算法GMM
  3. 在 Linux 中查找用户帐户和登录详细信息的 11 种方法
  4. Linux系统运维与架构设计之Linux概述
  5. SOLID原则 【转】
  6. 十步会用IOCOMP–iplotx控件
  7. python创建类的两个对象_Python为一个类创建多个对象
  8. MySQL---规范数据库设计
  9. 大数据是什么,大数据的主要特点是什么?
  10. H.264流媒体协议格式中的Annex B格式和AVCC格式深度解析