学习笔记 --- Java 并发编程总结一 countDownLatch,CyclicBarrier,Semaphore

在多线程程序设计中有三个同步工具需要我们掌握,分别是Semaphore(信号量),countDownLatch(倒计数门闸锁),CyclicBarrier(可重用栅栏)

  • CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:

    CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行

    而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行

    另外,CountDo

wnLatch是不能够重用的,而CyclicBarrier是可以重用的。

  • Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限

CountDownLatch   计数器   倒计数门闸锁

CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。

CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务

应用场景

CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后它才执行

CountDownLatch强调的n个线程,等待若干个其他线程结束,线程开始执行

实现最大的并行性:有时我们想同时启动多个线程,实现最大程度的并行性

开始执行前等待n个线程完成各自任务:应用程序启动类要确保在处理用户请求前,所有N个外部系统已经启动和运行了。

死锁检测:你可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁

CyclicBarrier 循环屏障   可重用栅栏

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

应用场景

  • CyclicBarrier强调的是n个线程,大家相互等待,只要有一个没完成,所有人都得等着

Semaphore 信号量

在Java的并发包中,Semaphore类表示信号量。Semaphore内部主要通过AQS(AbstractQueuedSynchronizer)实现线程的管理。Semaphore有两个构造函数,参数permits表示许可数,它最后传递给了AQS的state值。线程在运行时首先获取许可,如果成功,许可数就减1,线程运行,当线程运行结束就释放许可,许可数就加1。如果许可数为0,则获取失败,线程位于AQS的等待队列中,它会被其它释放许可的线程唤醒。

应用场景

信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制

参考:https://www.cnblogs.com/nullzx/p/5270233.html

猜你喜欢

转载自blog.csdn.net/tianyeshiye/article/details/84784137