JUC工具类

Semaphore

信号量,用来限制能同时访问共享资源的线程上限

Semaphore应用

  • 使用Semaphore限流,在访问高峰期时,让请求线程阻塞,高峰期过去再释放许可,当然它只适合限制单机线程数量,并且仅仅是限制线程数,而不是限制资源数
  • 用Semaphore实现简单连接池,性能和可读性显然更好

Semaphore原理

加锁(acquire)解锁(release)流程

Semaphore有点像一个停车场,permits就好像停车位数量,当线程获得了permits就像是获得了停车位,然后停车场显示空余车位就减一。

刚开始,permits(state)为3,这个时候5个线程来获取资源

假设其中Thread-1,Thread-2,Thread-4竞争成功,而Thread-0和Thread-3竞争失败,进入AQS队列park阻塞

假设这个时候Thread-4释放了permits,状态如下

接下来Thread-0竞争成功,permits再次设置为0,设置自己为head节点,断开原来的head节点,unpark接下来的Thread-3节点,由于permits是0,因此Thread-3在尝试不成功后再次进入park状态

CountdownLatch

用来进行线程同步协作,等待所有线程完成倒计时

其中构造参数用来初始化等待计数值await()用来等待计数归零,countDown()用来让计数减1

CyclicBarrier

循环栅栏,用来进行线程协作,等待线程满足某个计数,构造时设置计数个数,每个线程执行到某个需要同步的时刻调用await()方法进行等待,当等待的线程数满足计数个数的时候,继续执行。

栅栏可以使得一定数量的参与方反复在栅栏位置汇集,它在并行迭代算法中非常有用。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置时,那么栅栏将打开,此时所有线程都被释放,而栅栏将被重置以便下次使用。

注意:CyclicBarrier与CountdownLatch的主要区别在于CyclicBarrier可以被重用。

猜你喜欢

转载自blog.csdn.net/kidchildcsdn/article/details/113881136