同步(synchronization)是指协调并发操作,得到可以预测的结果的行为。同步在多个线程访问相同的数据时显得尤为重要,但这种操作很容易出现问题。最简单实用的同步工具是后面章节介绍的延续(continuation)和任务组合器。延续和任务组合器将并发程序构造为异步操作,减少了对锁和信号发送的依赖。但即便如此,很多时候仍然需要依赖那些同步底层结构。
同步结构可以分为三类:排他锁排他锁每一次只允许一个线程执行特定的活动或一段代码。它的主要目的是令线程访问共享的写状态而不互相影响。排他锁包括lock、Mutex和SpinLock。非排他锁非排他锁实现了有限的并发性。
非排他锁包括Semaphore(Slim)和 ReaderWriterLock(Slim)。信号发送结构这种结构允许线程在接到一个或者多个其他线程的通知之前保持阻塞状态。信号发送结构包括ManualResetEvent(Slim)、AutoResetEvent、CountdownEvent和Barrier。前三者就是所谓的事件等待句柄(event waithandle)。
一些结构在不使用锁的前提下也可以(巧妙地)处理特定的共享状态的同步操作,称为非阻塞同步结构(nonblocking synchronization construct)。它们包括Thread.MemoryBarrier、Thread.VolatileRead、Thread.VolatileWrite、volatile关键字和Interlocked类。