Count_Down

深入理解 JUC:CountDownLatch

时光总嘲笑我的痴心妄想 提交于 2020-11-11 07:57:06
CountDownLatch 是一个同步辅助工具,用于阻塞当前一个或多个线程以等待其它线程中的操作完成。在构造 CountDownLatch 对象时,我们需要指定一个非负的 count 值,一般情况下,调用 CountDownLatch#await 方法的线程需要阻塞等待该 count 值变为 0 时才能够继续往下执行。具体示例可以参考 理清 CountDownLatch 与 CyclicBarrier 的区别 。 CountDownLatch 实现内幕 CountDownLatch 在实现上同样依赖于 AQS 组件,在 CountDownLatch 的内部定义了一个 Sync 内部类,该类继承自 AbstractQueuedSynchronizer,并复用 AQS 的 state 字段以记录 count 值的变化。CountDownLatch 的核心方法均委托 Sync 进行处理,实现如下: public class CountDownLatch { private final Sync sync; public CountDownLatch(int count) { if (count < 0) { throw new IllegalArgumentException("count < 0"); } this.sync = new Sync(count); } public

CountDownLatch的理解和使用

巧了我就是萌 提交于 2020-11-11 07:29:25
在笔者想要了解Thrift时候,找到一个博主写的系统间通信技术的架构设计,在了解和学习的过程中遇到很多小问题和基础知识,自己还是不够清楚,就查询和总结下。 因为笔者也都是从网上找的一些资料,好的资料笔者都是自己收敲一遍,这样觉得能够加深下印象,引发更多的思考,毕竟很多时候笔者感觉自己都是七秒的记忆。 在第一篇文章中遇到了一个CountDownLatch同步计数器,当计数器数值减为0时,所有受其影响而等待的线程将会被激活,这样保证模拟并发请求的真实性。 CountDownLatch概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。 CountDownLatch的用法 CountDownLatch典型用法:1、某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减1

swift多线程定时器

ε祈祈猫儿з 提交于 2020-11-03 14:36:05
swift多线程定时器的使用 func countDown(_ timeOut:Int,view: UIView){ var timeout = timeOut let queue:DispatchQueue = DispatchQueue.global(qos: DispatchQoS.QoSClass.default) if timer == nil { timer = DispatchSource.makeTimerSource(flags: DispatchSource.TimerFlags(rawValue: 0), queue: queue) /*Migrator FIXME: Use DispatchSourceTimer to avoid the cast*/ as? DispatchSource } timer.schedule(deadline: DispatchTime.now(), repeating: DispatchTimeInterval.seconds(1), leeway: DispatchTimeInterval.seconds(0)) // timer.setTimer(start: DispatchWallTime(time: nil), interval: 1*NSEC_PER_SEC, leeway: 0) //每秒执行 timer

并发编程之CountDownLatch,CyclicBarrier ,Semaphore

牧云@^-^@ 提交于 2020-11-02 04:52:51
微信公众号: 北风中独行的蜗牛 关注可了解更多相关知识。问题或建议,请公众号留言; CountDownLatch CountDownLatch 这个类在java.util.concurrent并发包下 这个类的作用使一个线程等到其他线程都执行完了在执行本线程、 CountDownLatch根据名字也可以看出来,它其实是一个计数器,数量是需要等待执行完线程的数量,没执行完一个线程数量减1,当数量为零的时候,表示所有需要等待的线程执行完毕了,那么等待的的线程就可以继续执行了! 说起来有点绕,其实一点也不复杂: public static void main ( String[] args ) { final CountDownLatch latch = new CountDownLatch( 5 ); ExecutorService service = Executors.newFixedThreadPool( 10 ); for ( int i = 0 ; i < 5 ; i++){ service.execute(() -> { System. out .println( "开始执行" + Thread.currentThread().getName()); try { Thread.sleep( 3000 ); } catch (InterruptedException e) {

JUC并发编程之Semaphore信号量、CountDownLatch、CyclicBarrier栅栏、Executo...

泪湿孤枕 提交于 2020-11-01 19:58:12
Semaphore信号量: 这个东西很简单,别看字面意思,什么信号量,我也不懂得那个术语什么意思,Semaphore你可以这样来理解,我们要去看电影,而且是3D电影(必须戴3D眼镜才可以进入),但是比较不巧的是我们电影院只有两个3D眼镜了,也就是说,我们每次只能进去两个人看电影,然后等待这两个人看完电影以后把眼镜还回来,后面的两个人才能继续观看,就是说每次只允许最多进去两个人,每次进入到线程获取锁,需要你得到前置的票据,才可以进行后续的流程。可以理解为一个简单的限流吧。我们来一下代码示例。 public class Test { public static void main (String[] args) throws InterruptedException { Semaphore semaphore = new Semaphore( 2 ); for ( int i = 0 ; i < 5 ; i++) { new Thread( new Task(semaphore, "xiaocaijishu" +i)).start(); } } static class Task extends Thread { Semaphore semaphore; public Task (Semaphore semaphore,String tname){ this .semaphore =

多线程-1117

穿精又带淫゛_ 提交于 2020-10-31 05:58:50
规律: 多线程协作中,一般被考虑使用的,无非就是: (同步工具类) Semaphore ( semaphore.acquire() ;消耗许可数,许可数为负数时,当前线程将被阻塞 semaphore.release() ;增加许可数 ) CountDownLatch ( countDown.countDown() 初始值减1,当前线程总是不会被阻塞 countDown.await() 若值不为0则会被阻塞,等待初始值减为0才会恢复 ) CyclicBarrier ( cyclicBarrier.await() 初始值减1,并阻塞等待初始值减为0。最后一个线程将它减为0之后,若有指定任务,则还需要负责执行指定任务完毕,之后会唤醒之前被阻塞的所有线程,并重置为初始值。 有两个构造方法,其中一个构造方法可以指定每次最后一个线程,需要执行的额外任务。 cyclicBarrier.reset() 用于提前唤醒被阻塞的线程,并重置为初始值 ) (原子变量类) AtomicInteger 一般用于无锁进行自增计数情形 (锁) volatile + ( ReentrantLock + Condition ) / s ynchronized 通过 condition.await()/condition.signal() 或者 object.wait()/object.notify() 的 挂起

微信抢红包过期失效实战案例

妖精的绣舞 提交于 2020-10-29 07:45:15
前言 微信红包业务,发红包之后如果24小时之内没有被领取完就自动过期失效。 架构设计 业务流程 老板发红包,此时缓存初始化红包个数,红包金额(单位分),并异步入库。 红包数据入延迟队列,唯一标识+失效时间 红包数据出延迟队列,根据唯一标识清空红包缓存数据、异步更新数据库、异步退回红包金额 代码案例 这里我们使用 Java 内置的 DelayQueue 来实现, DelayQueue 是一个***的 BlockingQueue ,用于放置实现了 Delayed 接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。 老板发了10个红包一共200人民币,假装只有9个人抢红包。 发红包,缓存数据进入延迟队列: /** * 有人没抢 红包发多了 * 红包进入延迟队列 * 实现过期失效 * @param redPacketId * @return */ @ApiOperation(value="抢红包三",nickname="爪哇笔记") @PostMapping("/startThree") public Result startThree(long redPacketId){ int skillNum = 9; final CountDownLatch latch = new CountDownLatch(skillNum);//N个抢红包

JUC并发编程之Semaphore信号量、CountDownLatch、CyclicBarrier栅栏、Executo...

血红的双手。 提交于 2020-10-25 14:28:45
Semaphore信号量: 这个东西很简单,别看字面意思,什么信号量,我也不懂得那个术语什么意思,Semaphore你可以这样来理解,我们要去看电影,而且是3D电影(必须戴3D眼镜才可以进入),但是比较不巧的是我们电影院只有两个3D眼镜了,也就是说,我们每次只能进去两个人看电影,然后等待这两个人看完电影以后把眼镜还回来,后面的两个人才能继续观看,就是说每次只允许最多进去两个人,每次进入到线程获取锁,需要你得到前置的票据,才可以进行后续的流程。可以理解为一个简单的限流吧。我们来一下代码示例。 public class Test { public static void main(String[] args) throws InterruptedException { Semaphore semaphore = new Semaphore(2); for (int i = 0; i < 5; i++) { new Thread(new Task(semaphore,"xiaocaijishu"+i)).start(); } } static class Task extends Thread{ Semaphore semaphore; public Task(Semaphore semaphore,String tname){ this.semaphore = semaphore;

从Linux内核理解JAVA的NIO

断了今生、忘了曾经 提交于 2020-10-24 09:38:35
前言 IO 可以简单分为 磁盘 IO 和 网络 IO , 磁盘 IO 相对于 网络 IO 速度会快一点,本文主要介绍 磁盘 IO , 网络 IO 下周写。 JAVA 对 NIO 抽象为 Channel , Channel 又可以分为 FileChannel (磁盘 io)和 SocketChannel (网络 io)。 如果你对 IO 的理解只是停留在 api 层面那是远远不够的,一定要了解 IO 在系统层面是怎么处理的。 本文内容: FileChannel 读写复制文件的用法。 ByteBuffer 的介绍 jvm 文件进程锁,FileLock HeapByteBuffer ,DirectByteBuffer 和 mmap 谁的速度更快 从 Linux 内核 中的 虚拟内存 、 系统调用 、 文件描述符 、 Inode 、 Page Cache 、 缺页异常 讲述整个 IO 的过程 jvm 堆外的 DirectByteBuffer 的内存怎么回收 <img src="http://oss.mflyyou.cn/blog/20200711165857.png?author=zhangpanqin" alt="image-20200711165857889" style="zoom: 33%;" /> 本文计算机系统相关的图全部来自 《深入理解计算机系统》 对 Linux

java中5种异步转同步方法

被刻印的时光 ゝ 提交于 2020-10-22 08:28:35
先来说一下对异步和同步的理解: 同步调用:调用方在调用过程中,持续等待返回结果。 异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数。 其实,两者的区别还是很明显的,这里也不再细说,我们主要来说一下Java如何将异步调用转为同步。换句话说,就是需要在异步调用过程中,持续阻塞至获得调用结果。 不卖关子,先列出五种方法,然后一一举例说明: 使用wait和notify方法,synchronized 使用条件锁ReentrantLock Future 使用CountDownLatch 使用CyclicBarrier 0.构造一个异步调用 首先,写demo需要先写基础设施,这里的话主要是需要构造一个异步调用模型。异步调用类: public class AsyncCall { private Random random = new Random(System.currentTimeMillis()); private ExecutorService tp = Executors.newSingleThreadExecutor(); //demo1,2,4,5调用方法 public void call (BaseDemo demo){ new Thread(()->{ long res = random.nextInt(10); try {