【发布时间】:2013-02-25 18:43:04
【问题描述】:
鉴于以下 scala 中生产者-消费者问题的实现
class PC {
var buffer = null.asInstanceOf[Int]
var set = false
def produce(value: Int) = synchronized {
while (set) wait()
buffer = value
set = true
notify() }
def consume: Int = synchronized {
while (!set) wait()
val result = buffer
set = false
notify()
return result; }
}
有 3 件事情我不太明白:
为什么,如果我使用 notify 而不是 notifyAll,我最终会陷入死锁;我应该在哪里使用 notifyAll,用于生产或消费?
我不应该有一个对象吗?锁,并调用 lock.synchronized、lock.wait 和 lock.notify?为什么它会这样工作,不生产和消费有 2 个不同的监视器关联?为什么生产的“通知”通知消费的“等待”?
监视器在 scala 中是如何工作的(在我们的例子中)?它是否使用信号并继续策略?如何在特定条件下将等待队列中的进程移动到可运行队列?每个条件/锁是否有一个队列(例如 lock1.wait、lock2.wait 等)。
【问题讨论】:
-
P.S.我有一个生产者和多个消费者。
-
尝试使用docs.oracle.com/javase/6/docs/api/java/util/concurrent/…作为生产者/消费者,会更简单
-
我建议你避免使用 wait() 和 notify(),它们是非常低级的细粒度原语,并使用 java.util.concurrent 中的东西
标签: multithreading scala