02-简介
3.1 简介
在第2章中,我们介绍了同步的基本概念。通常,只有在任务并发地访问共享资源(如一个对象的属性值)时,才需要考虑同步控制,以保证不同的任务能正确访问同一资源。访问的这个共享资源的代码块,被称为临界区。
如果没有使用恰当的控制机制进行同步处理,那么就有可能得到错误的结果,产生数据不一致或者异常等问题。因此,我们需要使用Java API提供的同步机制来避免这些问题的出现。
在第2章中,我们介绍了下列3种基本的同步机制。
synchronized
关键字。Lock
接口及其实现类:ReentrantLock
、ReentrantReadWriteLock.ReadLock
和ReentrantReadWriteLock.writeLock
。StampedLock
类。
本章将介绍使用高级同步机制来实现多线程同步的方法。有如下所示的高级同步机制。
- Semaphore: 这是一个计数器,用来控制一个或多个共享资源的访问。这是一种基本并发编程工具,为大多数编程语言所支持。
- CountDownLatch:
CountDownLatch
类是Java语言提供的一个机制,可以使一个线程等待多个操作结束。 - CyclicBarrier:
CyclicBarrier
类是Java语言提供的另一个机制,可以使多个线程在一个共同状态点同步。 - Phaser:
Phaser
类也是Java语言提供的另一个机制,可以分阶段地控制并发任务的执行。只有所有的线程都完成一个阶段后,才能继续下一个阶段。 - Exchanger:
Exchanger
类也是Java语言提供的另一个机制,能够使得两个线程在某一点进行数据交换。 - CompletableFuture:
CompletableFuture
类提供了一个机制,在这个机制中一个或多个任务等待另外一些任务执行结束,并且这些任务将以异步方式运行。这个类在Java 8中引入,Java 9中新增了一些方法。
Semaphore是一种通用的同步机制,适用于任意问题的临界区保护。而其他同步机制,一般适用于前述的特定场景。因此,需要根据应用的特点来选取合适的同步机制。
本章的各个小节分别展示了这些同步机制的使用方法。