【发布时间】:2013-03-08 17:40:08
【问题描述】:
对于一项作业,我必须在 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() 上解除阻塞一个线程?我读到有一个被阻塞的队列,但我会在哪里继续引用该队列?
【问题讨论】:
-
您可以为此使用哪些锁定原语? Object#wait()?
-
为什么不实现
wait()和signal()作为实例方法呢?根据定义,信号量由多个线程调用。您需要同步以使代码线程安全。 (注意wait()应该命名为await()(或其他名称),因为 Object 已经有一个wait()方法)
标签: java signals block semaphore wait