有界缓冲区,互斥量与空的顺序。这是第一次

时间:2014-04-30 18:32:49

标签: java multithreading mutex semaphore

我有一个关于信号量(muxtex,空)在有限缓冲问题中的排序的问题,该问题出现在书#34;操作系统概念"加涅。 以下是我所指的代码的两个图像。

首先是有界缓冲区。

第二)插入方法。

我的问题是:在insert方法中使用mutex.acquire()之前的empty.acquire()是什么原因? 如果mutex.acquire()在empty.acquire之前出现,那么更清楚吗? 我知道在功能方面,顺序并不重要。但是有没有理由为什么作者在mutex.acquire之前调用empty.acquire?

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

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

如果相反,该功能将如下所示:

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

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