知识卡片
监控程序:把互斥责任收归数据自身
内容
多个并发线程同时读写同一份共享数据时,如果每个访问这份数据的代码单元都各自负责”进入前检查、离开后释放”这类[[信号量与临界区:解决竞态条件]]式的互斥逻辑,只要其中任何一处实现有误,整个系统的互斥保证就会被破坏——错误可能散落在程序的任意角落。更稳妥的做法是把访问控制的职责从”访问数据的一方”转移到”数据自身”:给数据项本身赋予控制自己被访问方式的能力,这种自带访问控制能力的数据结构称为监控程序。这样一来,互斥的实现被集中收敛到程序里的一个点,而不是分散复制进每一处调用点。发散:这是”谁来负责这件事”这个设计决策的又一次体现——与其寄望于所有调用方都自觉正确地遵守协议(人人自律,一旦有人失职就全盘皆输),不如把强制力收拢到被保护的资源自身,这个思路和[[特权级别:用硬件强制操作系统的权限边界]]里”把约束下沉到比被约束对象权限更低的层次”是同一种工程直觉。
参考来源
《计算机科学概论》第6章《程序设计语言》