我正在学习Java中的同步机制。这是我分析的示例代码。对于丢失的代码感到抱歉,但故事很简单。我们有2个消费者和4个生产者,他们被实现为Threads,他们分别在while循环中调用这些get和put方法。
问题是为什么我们陷入僵局? 另外,如果你能在我的脑海里回答我的一些问题。
处理与notify和wait通信的线程的Monitor与监视没有两个线程进入同步方法(获取或放置)的Monitor之间是否存在差异?也就是说,当put方法中的一个线程调用notify()时,另一个等待进入put方法的线程是一个有效的候选者来接管Monitor吗?
我的主要问题的答案是如此“明显和愚蠢”,当一个线程在方法put的wait()内,没有其他线程可以输入两个方法put并获取通知它导致死锁发生?
notify和notifyAll有什么区别?
public synchronized void put(Object o) throws InterruptedException {
while (count == size) {
wait();
}
buf[in] = o;
//System.out.println("PUT from " + Thread.currentThread().getName());
++count;
in = (in + 1) % size;
notifyAll(); // if this is not a notifyAll() we might notify the wrong waiter
}
public synchronized Object get() throws InterruptedException {
while (count == 0) {
wait();
}
Object o = buf[out];
buf[out] = null;
//System.out.println("GET from " + Thread.currentThread().getName());
--count;
out = (out + 1) % size;
notifyAll(); // if this is not a notifyAll() we might notify the wrong waiter
return (o);
}
答案 0 :(得分:0)
我的主要问题的答案是否明显而且愚蠢"虽然一个线程在方法put的wait()内,没有其他线程可以输入两个方法put并获取通知它会导致死锁发生?
o.wait()
执行一系列步骤:
o
,o.notify()
,因此当一个线程在wait()
调用中进行put(o)
调用时,另一个线程可以在get()
或put()
调用内执行。