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