gpt4 book ai didi

java - 信号量如何阻塞和解除阻塞

转载 作者:行者123 更新时间:2023-12-01 14:47:16 25 4
gpt4 key购买 nike

对于一项作业,我必须在 Java 中创建一个计数信号量。到目前为止我已经创建了这个简单的类

public class Semaphore {
int value;

public Semaphore(int value) {
this.value = value;
}

public static void wait(Semaphore s) {
s.value--;
if (s.value < 0) {
// block
}
}

public static void signal(Semaphore s) {
s.value++;
if (s.value <= 0) {
// unblock one process that is blocked on semaphore
}

}
}

现在我感到困惑的是,我到底如何在 wait() 上阻塞,反过来又如何在 signal() 上解锁一个线程?我读到有一个阻塞队列,但是我在哪里可以保留对该队列的引用?

最佳答案

在等待方法(应该称为 wait 之外的其他方法)中,您需要检查您的值是否为零,如果为零,则继续等待。这是通过以下方式实现的:

public synchronized void P() throws InterruptedException 
{
while (value == 0)
{
wait();
}
value--;
}

您的方法不采用 Semaphore 对象。您只需使用 Semaphore 类中的值字段即可。

该方法检查当该值为 0 时,它等待该值被更改。因此,调用该方法的线程将必须等待。否则,如果该值不为零,则线程可以进入其临界区,并且该值会递减,直到再次达到零,此时线程会阻塞。

您的信号方法需要增加该值,并通知正在等待的线程该值已更改,以查看其是否可以进入其临界区。 signal方法的实现如下:

public synchronized void V() 
{
value++;
notify();
}

我用于方法的命名来自 Dijkstra 用于信号量的名称(以防万一您对它们感到困惑)。

您不应该调用阻塞方法 wait,因为它会与 Object 中的 wait 方法混淆。

关于java - 信号量如何阻塞和解除阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15300049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com