java - 有界缓冲区,互斥体与空的顺序。哪一个先出现

标签 java multithreading mutex semaphore

我对 gagne 的《操作系统概念》一书中所示的有界缓冲区问题中的信号量(muxtex、空)排序有疑问。 下面是我所指的代码的两张图片。

首先)有界缓冲区。

第二)插入方法。

我的问题是:在插入方法中,在mutex.acquire()之前有empty.acquire()的原因是什么? 如果 mutex.acquire() 在 empty.acquire 之前不是更清楚吗? 我知道就功能而言,顺序并不重要。但是作者在mutex.acquire之前调用empty.acquire是有原因的吗?

enter image description here

enter image description here

最佳答案

对于缓冲区已满的情况,顺序很重要。 empty.acquire() 具有阻塞线程的效果,直到缓冲区中至少有一个空闲槽,然后再尝试将一项添加到缓冲区。

如果颠倒过来,该函数将如下所示:

public void insert(Object item) {
    mutex.acquire();
    empty.acquire();
    ...

如果在缓冲区已满时调用此方法,则当线程在 empty.acquire() 上阻塞时,将获取互斥体。然后,如果另一个线程调用 remove() 来释放缓冲区槽,它将在 mutex.acquire() 上阻塞。现在,无法添加新元素,因为缓冲区已满,所有删除对象的尝试都将被阻止。

关于java - 有界缓冲区,互斥体与空的顺序。哪一个先出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23395545/

相关文章:

java - Retrofit 2 Json返回列表为空

java(程序如何查找并打印总和和乘积。Ex.4)

java - 搜索数组的一部分的多个线程

java - Java 中对象实例的上限

java - 无法使用java通过way2sms发送短信

java - 如何释放JScrollpane使其不总是拖到底部?

java - 带有传感器数据的 Android Service 中的数据并发

c++ - 当线程数增加时,多线程文件 IO 程序的行为不可预测

python - 互斥锁与线程锁。使用哪个?

c# - C#中如何发现Mutex被获取?