使用CountDownLatch和CyclicBarrier的并发工具类
2021-03-02 21:21:06 0 举报
AI智能生成
并发工具类(CountDownLatch/CyclicBarrier)
作者其他创作
大纲/内容
阅读导航
<b style=""><font color="#0076b3">线程 👉</font></b>
<b><font color="#0076b3">CPU+JMM</font></b> 👉
<b><font color="#0076b3">CAS+Volatile</font></b> 👉
<b><font color="#0076b3">Synchronized</font></b> 👉
<b><font color="#0076b3">JUC</font></b>
<b style=""><font color="#0076b3">locks锁+atomic原子类 👉</font></b>
<b><font color="#0076b3">executor自定义线程池</font></b> 👉
<b><font color="#0076b3">collections并发容器</font></b> 👉
<b><font color="#f15a23">tools并发工具类</font></b>
<b><font color="#0076b3">线程池</font></b> 👉
<b style="font-size: inherit;"><font color="#0076b3">ThreadLocal</font></b><span style="font-size: inherit;"> 👉</span><br>
tools(并发工具类)
CountDownLatch
<b><font color="#662c90">让一个或者多个线程阻塞,等待其他多个线程完成某件事情之后,被阻塞的线程才执行</font></b>
场景:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行
使用
当一个或多个线程调用 await() 方法时,调用线程会被阻塞
当线程调用 countDown() 方法会将计数器减1,计数器为0时阻塞线程被唤醒(无法重置)
CyclicBarrier
<font color="#662c90"><b>允许一组线程互相等待,直到到达某个公共屏障点,在释放等待线程后可以重用</b></font>
没有直接实现AQS而是借助ReentrantLock来实现的同步机制(可循环使用)
Semaphore
<b><font color="#662c90">信号量主要用于多个共享资源的互斥使用,指定初始资源容量,也可以实现限流的功能</font></b>
基于AQS实现,信号量也分公平和非公平的情况,访问特定资源前,先使用acquire(1)获得许可,如果<br>许可数量为0,该线程则一直阻塞,直到有可用许可;访问资源后,使用release()释放许可
Phaser
一种可重用的同步屏障,功能上类似于CyclicBarrier和CountDownLatch,但使用上更为灵活。非常适用<br>于在多线程环境下同步协调分阶段计算任务(Fork/Join框架中的子任务之间需同步时,优先使用Phaser)
Exchanger
线程间交换数据,允许两个线程在某个汇合点交换对象,在某些管道设计时比较有用
CompletableFuture<br>(优雅的使用并发)
<b>supplyAsync()</b>:用来开启一个有返回值的异步任务
代码举例
<b>thenCompose()</b>:当第一个任务完成时才会执行第二个任务,开启新线程,最终结果由第二个任务返回
代码举例
<b>thenCombine()</b>:两个异步任务全部完成时才会执行某些操作
代码举例
<b>thenApply()</b>:与thenCompose类似,把多个任务串联起来处理,下一个任务会用到上一个任务的结果
代码举例
<b>applyToEither()</b>:哪个任务先执行完,就取哪个结果返回
代码举例
关于作者
<b style=""><font color="#b296c7">我的博客</font></b> 👉
<b><font color="#00a650">微信公众号</font></b> 👉
<b><font color="#f15a23">GitHub 导航</font></b> 👉
<b><font color="#662c90">ProcessOn 主页 👉</font></b>
0 条评论
下一页