本文摘自:Java并发编程实战:08 | 管程:并发编程的万能钥匙

定义

是管理共享变量以及对共享变量的操作过程,让他们支持并发。翻译为 Java 领域的语言,就是管理类的成员变量和成员方法,让这个类是线程安全的。
**
Java 内置的管程方案为:synchronized

管程如何解决并发问题

并发编程领域的两个核心问题为:互斥(同一时刻只允许一个线程访问共享资源同步(程之间如何通信、协作)。

这两大问题,管程都是能够解决的。

解决互斥问题

管程解决互斥问题的思路很简单,就是 将共享变量及其对共享变量的操作统一封装起来。假如我们要实现一个线程安全的阻塞队列,一个最直观的想法就是:将线程不安全的队列封装起来,对外提供线程安全的操作方法,例如入队操作和出队操作。
🐱 管程(Monitor) - 图1

解决同步问题

在管程模型里,共享变量和对共享变量的操作是被封装起来的,图中最外层的框就代表封装的意思。框的上面只有一个入口,并且在入口旁边还有一个入口等待队列。当多个线程同时试图进入管程内部时,只允许一个线程进入,其他线程则在入口等待队列中等待。这个过程类似就医流程的分诊,只允许一个患者就诊,其他患者都在门口等待。

管程里还引入了条件变量的概念,而且 每个条件变量都对应有一个等待队列,如下图,条件变量 A 和条件变量 B 分别都有自己的等待队列。

🐱 管程(Monitor) - 图2

条件变量条件变量等待队列的作用是什么呢?其实就是解决线程同步问题。你可以结合上面提到的阻塞队列的例子加深一下理解(阻塞队列的例子,是用管程来实现线程安全的阻塞队列,这个阻塞队列和管程内部的等待队列没有关系,一定要注意阻塞队列和等待队列是不同的)。