管程(Moniter): 并发编程的基本心法

  • Post author:
  • Post category:其他


所谓管程:指的是管理共享变量以及对共享变量的操作过程,让它们支持并发。翻译为 Java 就是管理类的成员变量和成员方法,让这个类是线程安全的。

是一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享资源。这些共享资源一般是硬件设备或一群变量。管程实现了在一个时间点,最多只有一个线程在执行管程的某个子程序。与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度上简化了程序设计。 管程提供了一种机制,线程可以临时放弃互斥访问,等待某些条件得到满足后,重新获得执行权恢复它的互斥访问。



MESA 模型

在管程的发展史上,先后出现过三种不同的管程模型,分别是:Hasen 模型、Hoare 模型和 MESA 模型。其中,现在广泛应用的是 MESA 模型,并且 Java 管程的实现参考的也是 MESA 模型。所以今天我们重点介绍一下 MESA 模型。

在并发领域,有两个核心问题:一个是互斥,一个是同步。管程就是来解决这两个问题的。

互斥:同一时刻只允许一个线程访问共享资源。

同步:线程之间如何通信、协作。



管程互斥与同步实现

它的思路很简单,将共享变量以及对共享变量的操作统一封装起来。如下图所示,管程 A 将共享变量 data 和相关的操作入队enq、出队deq 封装起来。线程 A 和线程 B想访问共享变量 data ,只能通过调用管程提供的 enq 和 deq 。当然前提是 enq、deq 保证互斥性,只允许一个线程进入管程。是不是很有面向对象的感觉。



版权声明:本文为GX199718原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。