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()由于消费者线程永远不会醒来,我们就有了死锁。
synchronizednotifyisEmptywait.
您需要一个绝对的保证,使服务员和通知者就谓词的状态达成一致。服务生在谓词进入睡眠前的某个点稍微检查它的状态,但它取决于谓词在进入睡眠时是否为真。这两个事件之间存在一段时间的漏洞,可能会破坏程序。
buffer.isEmpty()synchronized
TA贡献1890条经验 获得超9个赞
wait()wait()synchronized
synchronizedwait()
添加回答
举报
