【发布时间】:2012-01-18 00:41:46
【问题描述】:
我一直在学习 Java 中的并发性,但遇到了生产者-消费者问题。这显然是标准的,我在很多地方都看到了几乎相同的答案。
public synchronized void put(int num){
while (!empty) {
try{
wait(); }
catch {}
}
buffer=num;
empty=false;
notify();
}
public synchronized int take(){
while (empty) {
try{
wait(); }
catch {}
}
empty=true;
notify();
return buffer;
}
我对同步的理解是它使用对象范围的锁,这意味着线程不能同时在 put 和 take 中。但是,两种方法都等待另一种方法。这就是我感到困惑的地方:这似乎造成了僵局。如果线程 A 进入 while empty=false,它将等待。但是,线程 B 不能进入 take,因为它是同步的。因此 empty 将永远为 false,造成死锁。
然而,鉴于我基本上看过这个答案多少次,它似乎一定是正确的。我理解错了什么?
谢谢!
【问题讨论】:
标签: java multithreading concurrency synchronized producer-consumer