本文内容主要是,以官方文档资料和 Java 8 的 JDK 和 HotSpot 源码为依据,对 Java 的基于 synchronized
和 ReentrantLock
线程同步的底层实现原理进行总结梳理和深度解析。同时,也在广度上对线程同步相关的基础概念做总结概括。
基础概念
在并发编程模型中,需要处理的两个最关键的问题就是通信(communication)和同步(synchronization)[1]。通信指线程可用于获得其他线程产生的信息的各种机制。通信机制通常都基于共享内存(shared memory)或消息传递(message passing)。在共享内存的编程模型中,某些或全部程序变量可以由多个线程访问。如果一对线程之间需要通信,只要一个线程将值写入某个变量,另一线程来读它即可。在消息传递编程模型中,不同线程没有公共的状态。当一对线程之间需要通信时,其中的一个必须执行一次明确的 send 操作,将数据传送给另一个线程。
同步[1:1]是控制不同线程之间操作发生的相对顺序的各种机制,用以排除导致不正确结果的交错。消息传递模型中的同步通常是隐式的,消息的发送必须在接收之前。如果某个线程企图接收一个尚未发送的消息,那么它就必须等到发送方赶上来。在共享内存编程模型中,同步通常不是隐式的,除非我们做了某些特殊的事情,否则“接收方”就可能在某个变量被“发送方”修改之前读到其中的“老”值。