为什么 wait 必须在 synchronized 保护的同步代码中使用?
在使用 wait 方法时,必须把 wait 方法写在 synchronized 保护的 while 代码块中,并始终判断执行条件是否满足,如果满足就往下继续执行,如果不满足就执行 wait 方法,而在执行 wait 方法之前,必须先持有对象的 monitor 锁,也就是通常所说的 synchronized 锁。
synchronized (obj) {
while (condition does not hold) {
obj.wait();
}
... // Perform action appropriate to condition
}
那么设计成这样有什么好处呢?
先看一段代码:
// 典型的生产者消费者的思想
class BlockingQueue {
Queue<String> buffer = new LinkedList<String>();
public void add(String data) {
buffer.add(data);
notify();
}
public String remove() throws InterruptedException {
while (buffer.isEmpty()) {
wait();
}
return buffer.remove();
}
}
这段代码的问题在哪里呢?这段代码并没有受 synchronized 保护,于是便有可能发生以下场景:
1,首先,消费者线程调用 remove 方法并判断 buffer.isEmpty 方法是否返回 true,

最低0.47元/天 解锁文章
596

被折叠的 条评论
为什么被折叠?



