java面试必问—CountDownLatch Semaphore CycliBarrier线程阻塞

java 并发包中有三个类用于同步一批线程的行为,分别是CountDownLatch,Semaphore,CyclicBarrier

一:CountDownLatch

1:countDownLatch是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能, 即一个线程或者多个线程一直等待,直到其他线程操作完成,CountDownLatch用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程能操作该计数器。调用该类的await方法的线程会一直处于阻塞状态,直到其他线程刁红countDown方法使当前计数器的值为0,每次调用countDown方法计数器减一操作,当计数器的值减到0时,所有调用await方法而处于等待状态的线程就会继续往下执行,这种现象只会出现一次,如下图所示

上面我用一个线程池来模拟多线程操作的问题

从打印的结果可以看到直到计数器的个数是0时阻塞的线程才往下执行

二:Semaphore

现在我们用信号量Semaphore 来模拟阻塞

Semaphore是Synchronized的加强版,作用是控制线程的并发数量,就这一点而言,单纯的synchronized关键字是实现不了的。

Semaphore可以用于做流量控制,特别是公用资源有限的场景,比如数据库连接

如下图所示:

从上图我们可以看到,当信号量初始值是4的时候,这个时候线程0,2,4,1开始购票,当线程0购票成功后线程6才开始购票

acquire()获取信号量,release()释放信号量

三:CyclicBarrier

继续测试CyclicBarrier

栅栏类似于闭锁,他能阻塞一组线程直到某个事件的发生,栅栏于闭锁的区别是,所有的线程必须同时到达栅栏位置,才能继续执行,闭锁用于等待事件而栅栏用于等待其它线程

首先说下CyclicBarrier和CountDownLatch 的区别

CountDownLatch:一个或者多个线程执行完毕后,才会继续执行

CyclicBarrier:多个线程相互等待,直到这些线程都达到某个点才开始继续执行下一步操作

如下图所示:

那么当线程数量大于默认参数时会怎么样呢?

这个问题就是当调用await方法加1后值和构造参数不同时线程会一直阻塞,因为我要拦截的数量是6个,但是现在到达栅栏处的数量才5个,我就会一直等待

参数表示屏障拦截的线程数量,如果await的数量一直小于构造参数里面的数量时,就会一直处于拦截状态,当然如果构造参数小于线程数量时那么也会提前拦截的

下图具体说下CountDownLatch和CycliBarrier的区别

--------------------------------------------------------------------

以上内容纯手打,参考大量资料,如果感觉帮到你了,请点一个赞,帮忙转发!谢谢!

如果有不同的看法,可以留言交流,共同进步!需要源码可以私信!

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();