加载中...

| 中文名 | 管程 |
| 外文名 | Monitor |
| 提出者 | 霍尔、汉森 |
| 提出年代 | 20世纪70年代 |
| 组成 | 共享数据、过程、条件变量 |
| 典型实现 | Java synchronized |
管程是一种将共享资源及其操作封装为一个模块并自动保证互斥访问的高级同步机制,由霍尔(Tony Hoare)与汉森(Per Brinch Hansen)在 20 世纪 70 年代提出,目的是降低直接使用信号量编写并发程序的复杂度与出错率。
直接使用信号量虽然灵活,但 P、V 操作分散在代码各处,极易因遗漏或顺序错误而引入死锁。管程把互斥的责任交给编译器或运行时:它将共享变量和访问过程集中封装,规定任一时刻最多只有一个线程能在管程内执行,从而把互斥逻辑与业务逻辑解耦,让程序员专注于同步条件本身。许多现代语言的内置同步机制正是管程思想的体现。
条件变量的唤醒语义分为两种:霍尔语义要求 signal 后立即把管程让给被唤醒线程;而更常见的实现采用 signal-and-continue 语义,被唤醒线程需重新竞争进入。正因为唤醒后条件可能已被别的线程改变,等待通常必须写在 while 循环里重新检查,而非 if。
问:为什么条件等待要放在 while 而不是 if 中?答:因为线程被唤醒后并不保证条件仍然成立,可能存在虚假唤醒或条件被其他线程再次破坏,用 while 重新检查才能确保条件真正满足后才继续执行。
问:管程和信号量哪个更好?答:两者表达能力等价,可相互实现。管程结构化程度更高、更不易出错,适合封装复用;信号量更底层灵活,适合精细控制,实际选择取决于语言支持与场景。

| 中文名 | 管程 |
| 外文名 | Monitor |
| 提出者 | 霍尔、汉森 |
| 提出年代 | 20世纪70年代 |
| 组成 | 共享数据、过程、条件变量 |
| 典型实现 | Java synchronized |
登录 后参与讨论
暂无讨论,来发表第一条评论吧