目录
一、引言
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier、Semaphore和exchanger。
Semaphore:一个计数信号量
CountDownLatch:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CyclicBarrier:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点
Exchanger:方便了两个共同操作线程之间的双向交换
下面举例子分别介绍这些类的使用场景
二、Semaphore
Semaphore 信号量对象管理的信号就像令牌,构造时传入个数,总数就是控制并发的数量。我们需要控制并发的代码,执行前先获取信号(通过acquire获取信号许可),执行后归还信号(通过release归还信号许可)。每次acquire成功返回后,Semaphore可用的信号量就会减少一个,如果没有可用的信号,acquire调用就会阻塞,等待有release调用释放信号后,acquire才会得到信号并返回。
如果Semaphore管理的信号量为1个,那么就退化到互斥锁了;如果多于一个信号量,则主要用于控制并发数。与通过控制线程数来控制并发数的方式相比,通过Semaphore来控制并发数可以控制得更加细粒度,因为真正被控制最大并发的代码放到acquire和release之间就行了。
使用场景,食堂做饭只有四个切菜刀,有十个人要切十个菜,限制菜刀数量抢到的先切菜,切完再给别人。
public class Testsemophore {
public static void main(String[]args){
final Semaphore semaphore = new Semaphore(3);
for (int i=0;i<7;i++)
{
new Thread(new Runnable() {
public void run() {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"获取到许可");
Thread.sleep(1000);
semaphore.release();
} catch (InterruptedException e) {
e.printSt