并发编程中的锁机制与同步策略
1. 同步与监视器概述
在并发编程中,同步是确保多个线程安全访问共享资源的关键。监视器是一种将同步和数据结合的结构化方式,类似于类将数据和方法封装在一起,监视器将数据、方法和同步封装在一个模块化的包中。
1.1 模块化同步的重要性
假设有一个应用程序,包含一个生产者线程和一个消费者线程,它们通过一个共享的先进先出(FIFO)队列进行通信。一种简单的做法是让线程共享两个对象:一个未同步的队列和一个用于保护队列的锁。生产者的代码可能如下:
mutex.lock();
try {
queue.enq(x)
} finally {
mutex.unlock();
}
然而,这种方法存在问题。如果队列是有界的,当队列已满时,尝试添加元素的操作必须等待队列有空间才能继续。此时,是否阻塞调用的决策取决于队列的内部状态,而这对于调用者来说是不可访问的。更糟糕的是,如果应用程序中有多个生产者和消费者,每个线程都必须同时跟踪锁和队列对象,并且只有当每个线程遵循相同的锁定约定时,应用程序才能正常工作。
一种更合理的方法是让每个队列管理自己的同步。队列本身有一个内部锁,每个方法在调用时获取该锁,并在返回时释放。这样,使用队列的线程无需遵循繁琐的同步协议。如果一个线程尝试将元素入队到一个已满的队列中, enq() 方法可以检测到问题,暂停调用者,并在队列有空间时恢复调用者。
2. 监视器锁和条件
2.1 锁的基本概念
锁是确保
超级会员免费看
订阅专栏 解锁全文
170万+

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



