【发布时间】:2017-04-06 12:08:54
【问题描述】:
我想知道例如 r.wait() 是否有效?使用此代码:
public class Buffer1<T> {
private T content;
private boolean empty;
private Object r = new Object();
private Object w = new Object();
public Buffer1() {
empty = true; }
public Buffer1(T content) {
this.content = content;
empty = false; }
public T take() throws InterruptedException {
synchronized (r) {
while (empty) {
r.wait();
}
synchronized (w) {
empty = true;
w.notify();
return content;
}
}
}
public void put(T o) throws InterruptedException {
synchronized(w) {
while (!empty) {
w.wait();
}
synchronized (r) {
empty = false;
r.notify();
content = o;
}
r.wait()、w.wait()、r.notify()、w.notify() 是如何工作的?以及它们如何与 synchronized(r) / synchronized(w) 一起工作?
【问题讨论】:
-
好吧,
notifyAll()可能会让你的生活更简单……它实际上不应该唤醒特定的线程组。它唤醒所有线程。这就是为什么wait()总是应该出现在循环中的原因。一旦被唤醒,线程本身应该检查现在是否是唤醒的好时机,如果不是,则返回wait()ing。但是 wake 和 notify 是并发编程的低级结构,你真的应该考虑使用 Executor Framework 来简化并发模块的组合。 -
或者
java.util.concurrent包中的信号量。
标签: java multithreading wait notify synchronized-block