同步机制

任务的同步机制是任务之间为得到预期结果而进行的协调。

在并发应用程序中,有两种同步机制。

Java 并发 API 提供了多种机制,让你可以实现上述两种类型的同步。

synchronized

Java 语言提供的最基本的同步机制是 synchronized 关键字。
该关键字可应用于某个方法或者某个代码块。
对于第一种情况,一次只有一个线程可以执行该方法。
对于第二种情况,要指定一个对某个对象的引用。
在这种情况下,同时只能执行被某一对象保护的一个代码块。

其他同步机制

Java 也提供了其他一些同步机制。

详细介绍

CommonTask 类

CommonTask 类将在随机的一段时间(0 到 10 秒)内将调用线程休眠。

Lock 接口

Lock 接口 基本实现类是 ReentrantLock 类。

Semaphore 类

信号量机制用于控制对一个或多个共享资源的访问。

该机制基于一个内部计数器以及两个名为 wait() 和 signal() 的方法。

当一个线程调用了 wait() 方法时:

当一个线程调用了 signal() 方法时,信号量将会检查是否有某些线程处于等待状态(它们已经调用了 wait() 方法)。

在 Java 中,信号量在 Semaphore 类中实现。
wait() 方法被称作 acquire() ,而 signal() 方法被称作 release() 。

Semaphore 类

CountDownLatch 类

CountDownLatch类提供了一种等待一个或多个并发任务完成的机制。

它有一个内部计数器,必须使用要等待的任务数初始化。
然后, await() 方法休眠调用线程,直到内部计数器为 0,并且使用 countDown()方法对该内部计数器做递减操作。

CountDownLatch 类

CyclicBarrier 类

CyclicBarrier类允许将一些任务同步到某个共同点。
所有的任务都在该点等待,直到任务全部到达该点为止。

从内部来看,该类还管理了一个内部计数器,用于记录尚未到达该点的任务。
当一个任务到达指定点时,它要执行 await() 方法以等待其他任务。
当所有任务都到达时, CyclicBarrier 对象将它们唤醒,这样就能够继续执行。
当所有的参与方都到达后,该类允许执行另一个任务。

为了实现这一点,要在该对象的构造函数中指定一个 Runnable 对象。

CyclicBarrier 类

CompletableFuture 类

与 Future 接口相同, CompletableFuture 也必须采用操作要返回的结果类型进行参数化。
和 Future 对象一样, CompletableFuture 类表示的是异步计算的结果,只不过 CompletableFuture 的结果可以由任意线程确立。

当计算正常结束时,该类采用 complete() 方法确定结果,而当计算出现异常时,则采用 completeExceptionally() 方法。
如果两个或者多个线程调用同一 CompletableFuture 的 complete() 方法或 completeExceptionally() 方法,那么只有第一个调用会起作用。

该类提供了大量方法,允许通过实现一个事件驱动的模型组织任务的执行顺序,一个任务只有在其之前的任务完成之后才会开始。
这其中包括如下方法。

如果想要获取 CompletableFuture 返回的结果,可以使用 get() 方法或者 join() 方法。
这两个方法都会阻塞调用线程,直到 CompletableFuture 完成之后返回其结果。
这两个方法之间的主要区别在于:

CompletableFuture 类