Java并发包主要有以下部分构成:

  • 同步对象 主要提供多个线程以何种方式进行通信协作
  • 执行器  管理多线程,提供线程运行入口
  • 控制线程访问资源的顺序
  • 原子操作 对Java的基本类型进行了封装,对integer等这些包装类提供了原子操作
  • 并发框架  为了简化并行编程的复杂性,Java或者其他公司定义的并发框架

 

java 并发事务唯一吗 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的主要用途是同步多个阶段。