并发编程中的监视器与阻塞同步技术解析
1. 监视器与模块化同步
在并发编程里,监视器是一种将同步和数据相结合的结构化方式。它就像一个类封装数据和方法那样,把数据、方法以及同步机制整合在一个模块化的包中。模块化同步十分重要,我们可以通过一个生产者 - 消费者模型来理解。假设应用中有两个线程,一个生产者和一个消费者,它们通过一个共享的 FIFO 队列进行通信。若让这两个线程共享一个未同步的队列和一个用于保护队列的锁,生产者的代码可能如下:
mutex.lock();
try {
queue.enq(x)
} finally {
mutex.unlock();
}
但这种方式存在问题。若队列是有界的,往已满的队列添加元素时,必须等队列有空间才能继续。此时,是否阻塞调用取决于队列的内部状态,而这对调用者来说是不可访问的。更糟糕的是,当应用中有多个生产者、消费者或两者都有时,每个线程都要同时管理锁和队列对象,并且只有每个线程遵循相同的锁定约定,应用才能正常运行。
更合理的做法是让每个队列自行管理同步。队列自身有内部锁,每个方法在调用时获取锁,返回时释放锁。这样就无需确保使用队列的每个线程都遵循繁琐的同步协议。若线程尝试往已满的队列添加元素, enq() 方法能检测到问题,暂停调用者,等队列有空间时再恢复调用者。
2. 监视器锁与条件
2.1 锁的基本概念
锁是确保互斥的基本机制,同一时间只有一个线程能持有锁。线程开始持有锁时获取锁,停止持有锁时释放锁。监视器导出一组方法,每个方法在调
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



