关于Java syncrhonized 关键字用到的 monitor 的概念

学习Java syncrhonized 关键字, 以及wait(), notify(), notifyAll 的时候, 经常会遇到一个单词: monitor 或者另外一个关键词 intrinsic lock(内置锁), 它们都是同一个东西. 也会有人说: wait(), notify(), notifyAll都是 monitor 的方法. 那么 monitor 到底是什么呢? 翻译成中文应该是什么呢?


在计算机科学中,"monitor"是一种用于管理并发访问共享资源的高级抽象。它由Per Brinch Hansen和C.A.R. Hoare于1970年代提出,并成为了处理并发的重要概念。

Monitor的基本思想是将共享资源(例如内存、文件、设备等)封装成一个单一的实体,称为"monitor"。这个monitor可以被多个并发执行的进程或线程所访问,但是一次只允许一个进程或线程执行其中的代码,从而避免了对共享资源的竞争条件和数据不一致性。

Monitor通常包含了以下几个要素:

  1. 互斥(Mutual Exclusion):当一个进程或线程进入monitor并执行其中的代码时,其他进程或线程将被阻塞,无法同时进入monitor。这样可以保证在同一时刻只有一个进程或线程可以访问共享资源,从而避免了竞争条件。
  2. 条件变量(Condition Variables):用于实现进程或线程之间的等待和通知机制。一个进程或线程可以在monitor中等待某个条件变为真,而其他进程或线程可以通过设置条件变量的值来通知等待的进程或线程条件已经满足,从而避免了忙等待。
  3. 入口队列(Entry Queue):用于管理等待访问monitor的进程或线程。当一个进程或线程请求进入monitor时,如果monitor已经被占用,则该进程或线程将被放入入口队列中,按照先来先服务的原则等待访问monitor。

使用monitor可以简化并发编程的复杂性,提供了一种结构化的方式来管理共享资源的访问,并且避免了许多并发编程中可能出现的问题,如竞争条件、死锁和饥饿等。它在操作系统、并发编程框架和并发控制算法中得到了广泛的应用,成为了并发编程中的重要工具。


看完上面的介绍, 是不是感觉跟 Java 的 syncrhonized 很像, 是的. Java 最初的设计就是想实现任何一个Java 对象都是一个包含 monitor 的想法.

但是 Java 对象跟最初 monitor 的实现有点差别:

  1. Monitor 的设计中, 任何对象的字段都是隐藏的, 任何方法都是需要获得锁才能进入的, 但是Java的对象并不是这样的.
  2. Monitor 可以有多个条件变量, 这类似后面Java 引入的Lock关联的Condition的概念, 一个Lock有多个Condtion, 但是 syncrhonized 却只有一个条件变量.
  3. 若有多个线程等待同一个条件变量, 只能notifyAll, 然后再由线程自己去判断自己等待的条件满足了吗.

monitor 在操作系统层面的实现

monitor 只是一个概念, 具体到操作系统层面, 要具体到特定的技术去实现. 比如用Semaphore(信号量)去实现, 或者使用 test-and-set 指令去实现

关于 monitor 的概念, 这篇wiki 讲的比较详细: https://en.wikipedia.org/wiki/Monitor_(synchronization)#Semaphore.

关于Java syncrhonized 的实现, 可以参考: https://blogs.oracle.com/javamagazine/post/java-thread-synchronization-synchronized-blocks-adhoc-locks

标签: none

添加新评论