Java并发包主要有如下部分构成:编程
以上对相关的类有一个大体的概览,下面主要大概的讲述一下同步对象的使用场景
Semaphore:网络
信号量:信号量经过计数器控制对共享资源的访问。若是计数器大于0,访问容许,若是为0,访问是拒绝的。计数器计数容许访问共享资源的许可证,所以,为了访问资源,线程必须获取信号量的访问许可。一般,为了使用信号量,但愿访问共享资源的线程尝试取得许可。若是信号量的计数器大于0,就代表线程取得了许可证,这会致使信号量的计数减少;不然线程会被阻塞,直到可以获取许可证为止。当线程不须要访问共享资源时,释放许可证,从而增大信号量的计数。若是还有另外的一个线程正在等待许可证,该线程将在这一刻取得许可证多线程
CountDownLatch:并发
有时候但愿线程进行等待,直到发生一个或多个事件为止。为了处理这类状况,并发API提供了CountDownLatch类。CountDownLatch在初始建立时带有时间数量计数器,在释放锁存器以前,必须发生指定数量的时间。每次发生一个事件时,计数器递减。当计数器达到0时,打开锁存器。框架
Exechanger:spa
其设计的目的是简化两个线程之间的数据交换。Exchager对象操做出奇的简单;简单的进行等待,知道两个独立的线程调用exchange()方法为止。当发生这种状况时,交换线程提供的数据。这种机制既优雅又易于使用。exchanger的用途很容易想象出来。例如:一个线程可能经过网络接收信息准备好一个缓冲区,另外一个线程可能使用来自链接的信息填充这个缓冲区。这两个线程能够协同共工做,每当须要一个新的缓冲区时,就进行一次数据交换线程
CyclicBarrier:设计
两个或者多个县城组必须在预约的执行点等待,直到线程组中全部的线程都到达执行点为止。为了处理这种状况,并发API提供了CyclicBarrier类。使用CyclicBarrier类能够定义具备如下特色的同步对象,同步对象被被挂起,直到指定数量的线程都达到临界点为止。对象
Phaser:事件
该类的主要目的是容许一个或者多个活动阶段的线程进行同步。例如,可能有一组线程实现了订单处理应用程序的3个阶段。在第一阶段,每一个线程分别用于确认客户信息,检查清单,和确认订价。当改阶段完成后,第二阶段有两个线程,用于计算运输成本以及使用的全部税收。以后,最后一个阶段肯定支付而且断定大体的运输时间。在过去,为了同步构成这种状况的多个线程,须要多一些工做。在提供Phaser类以后,这种处理如今就容易多了。 首先,Phaser类除了支持多个阶段以外,其工做方式与CyclicBarrier相似,清楚这点是有帮助的。所以经过Phaser能够定义等待特定阶段完成同步对象。而后推行到下一阶段,再次进行等待,直到那一阶段完成为止。Phaser也能够用做同步只有一个阶段的状况,在这种状况下,Phaser的行为和CyclicBarrier很是类似。可是,Phaser的主要用途是同步多个阶段。