java set同步_Java concurrent 包 – 同步辅助类

一,Semaphore – 计数信号

从概念上讲,信号量维护了一个许可集。在访问某有限资源前,通过 acquire() 获取许可,若许可均已用尽,则线程阻塞。而 release() 则释放一个许可,从而可能释放一个正在阻塞的获取者。

Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。

参看 Java API 的代码示例。

构造方法:

Semaphore(int permits)

创建具有给定的许可数和非公平的公平设置的 Semaphore。当 permits = 1,则可用作互斥锁。

Semaphore(int permits, boolean fair)

创建具有给定的许可数和给定的公平设置的 Semaphore。

主要方法:

void acquire()

获取一个许可,在得到一个许可前线程将一直阻塞,否则线程被中断。

void release()

释放一个许可,将其返回给信号量。

二,CyclicBarrier

CyclicBarrier 允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

CyclicBarrier(其构造方法)支持一个可选的 Runnable 命令(即屏障操作),在这组线程中的最后一个线程到达之后(但在释放所有线程之前),该 Runnable 只在这个屏障点运行一次。

构造方法:

CyclicBarrier(int parties)

创建一个新的 CyclicBarrier。

CyclicBarrier(int parties, Runnable barrierAction)

创建一个新的 CyclicBarrier。barrierAction 即上面提及的屏障操作(Runnable),该操作由最后一个进入 barrier 的线程执行。

主要方法:

int await()

一直等待,直到所有参与者都已经在此 barrier 上调用了 await 方法。

int await(long timeout, TimeUnit unit)

一直等待,直到所有参与者都已经在此屏障上调用了 await 方法之前, 或者超出了指定的等待时间。

三,CountDownLatch

通过 countDown() 方法使得计数递减,在计数到达零之前,await 方法会一直受阻塞。在计数递减至零后,会释放所有等待的线程,即 await 的所有后续调用都将立即执行。计数无法被重置。

常见的用法是,主线程创建一个初始计数为 N 的 countdown latch,然后创建 N 个线程去分解完成整个任务,每个任务在完成后将计数递减,最终 N 个线程执行完毕后,计数递减为 0, 主线程的 await() 方法的后续操作因此继续得以执行。

构造方法:

CountDownLatch(int count)

构造一个 CountDownLatch,count为初始计数。

主要方法:

await()

使当前线程在锁存器倒计数至零之前一直等待。

countDown()

递减锁存器的计数,如果计数到达零,则释放所有等待的线程。

四,Exchanger

使得两个线程可以彼此交换数据。两个线程都需要调用 v exchange(v) 方法,该方法的参数 v 是当前线程所持有并要交换给另一线程的数据,而返回的 v 则是从另一线程处获取的。

主要方法:

exchange(V x)

等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。

五,Phaser

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值