并发编程中的监视器与阻塞同步
在并发编程的世界里,同步和数据的管理是至关重要的。本文将深入探讨监视器、锁、条件对象以及读写锁等关键概念,帮助你更好地理解和运用这些技术来实现高效、安全的并发程序。
1. 监视器简介
监视器是一种将同步和数据结合起来的结构化方式。它类似于类,类将数据和方法封装在一起,而监视器则将数据、方法和同步机制整合在一个模块化的包中。
为了说明模块化同步的重要性,我们以一个生产者 - 消费者模型为例。假设应用程序中有两个线程,一个生产者和一个消费者,它们通过一个共享的 FIFO 队列进行通信。一种简单的做法是让线程共享两个对象:一个未同步的队列和一个用于保护队列的锁。生产者代码可能如下:
mutex.lock();
try {
queue.enq(x)
} finally {
mutex.unlock();
}
这种方法存在问题。如果队列是有界的,当队列已满时,添加元素的操作必须等待队列有空间才能继续。此时,是否阻塞调用取决于队列的内部状态,而调用者通常无法访问该状态。更糟糕的是,如果应用程序中有多个生产者和消费者,每个线程都需要同时管理锁和队列对象,并且只有当每个线程遵循相同的锁定约定时,应用程序才能正常工作。
更合理的方法是让每个队列自行管理同步。队列本身有一个内部锁,每个方法在调用时获取该锁,并在返回时释放。如果一个线程试图将一个元素加入到已满的队列中, enq() 方法可以检测到问题,暂停调用者,并在队列有空间时恢复调用者。
超级会员免费看
订阅专栏 解锁全文
31

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



