19、并发编程中的监视器与阻塞同步技术解析

并发编程中的监视器与阻塞同步技术解析

1. 监视器与模块化同步

在并发编程里,监视器是一种将同步和数据相结合的结构化方式。它就像一个类封装数据和方法那样,把数据、方法以及同步机制整合在一个模块化的包中。模块化同步十分重要,我们可以通过一个生产者 - 消费者模型来理解。假设应用中有两个线程,一个生产者和一个消费者,它们通过一个共享的 FIFO 队列进行通信。若让这两个线程共享一个未同步的队列和一个用于保护队列的锁,生产者的代码可能如下:

mutex.lock();
try {
    queue.enq(x)
} finally {
    mutex.unlock();
}

但这种方式存在问题。若队列是有界的,往已满的队列添加元素时,必须等队列有空间才能继续。此时,是否阻塞调用取决于队列的内部状态,而这对调用者来说是不可访问的。更糟糕的是,当应用中有多个生产者、消费者或两者都有时,每个线程都要同时管理锁和队列对象,并且只有每个线程遵循相同的锁定约定,应用才能正常运行。

更合理的做法是让每个队列自行管理同步。队列自身有内部锁,每个方法在调用时获取锁,返回时释放锁。这样就无需确保使用队列的每个线程都遵循繁琐的同步协议。若线程尝试往已满的队列添加元素, enq() 方法能检测到问题,暂停调用者,等队列有空间时再恢复调用者。

2. 监视器锁与条件

2.1 锁的基本概念

锁是确保互斥的基本机制,同一时间只有一个线程能持有锁。线程开始持有锁时获取锁,停止持有锁时释放锁。监视器导出一组方法,每个方法在调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值