3 回答
TA贡献1856条经验 获得超17个赞
A wait()
notify()
wait()
if(!condition){ wait();}
您可以得到虚假的唤醒(这意味着线程可以在没有收到通知的情况下从等待中醒来),或者 条件可以设置,但是第三个线程在等待线程醒来时(并重新获取监视器)再次使条件变为假。
synchronized(lock){ while(!condition){ lock.wait(); }}
java.util.concurrent
TA贡献1829条经验 获得超4个赞
如果可以调用,那么潜在的损害是什么? wait()
在同步块之外,保留它的语义-挂起调用线程?
wait()
class BlockingQueue { Queue<String> buffer = new LinkedList<String>(); public void give(String data) { buffer.add(data); notify(); // Since someone may be waiting in take! } public String take() throws InterruptedException { while (buffer.isEmpty()) // don't use "if" due to spurious wakeups. wait(); return buffer.remove(); }}
使用者线程调用 take()
看到 buffer.isEmpty()
.在使用者线程继续调用之前 wait()
,就会出现一个生产者线程并调用一个完整的线程。 give()
就是, buffer.add(data); notify();
使用者线程现在将调用 wait()
(和 小姐这个 notify()
刚刚打电话)。 如果不幸,生产者线程不会产生更多 give()
由于消费者线程永远不会醒来,我们就有了死锁。
synchronized
notify
isEmpty
wait
.
您需要一个绝对的保证,使服务员和通知者就谓词的状态达成一致。服务生在谓词进入睡眠前的某个点稍微检查它的状态,但它取决于谓词在进入睡眠时是否为真。这两个事件之间存在一段时间的漏洞,可能会破坏程序。
buffer.isEmpty()
synchronized
TA贡献1890条经验 获得超9个赞
wait()
wait()
synchronized
synchronized
wait()
添加回答
举报