我在网上搜索 wait() 和 notify() 的例子,找到了下面的例子。 在下面的代码块中,getValue() 和 setValue 方法都是同步的。如果我创建两个线程并且第一个线程获得锁,第二个线程是否会无限期地等待,直到第一个线程释放锁?所以不可能同时运行 getValue() 和 setValue() 吗?如果是, wait() 和 notify() 方法将一无所获。
tldr:如何同时从不同线程调用 getValue() 和 setValue() 方法?
public class Data {
private int value;
private boolean available = false;
public synchronized int getValue() {
while (!available) {
try {
wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
available = false;
notifyAll();
return value;
}
public synchronized void setValue(int value) {
while (available) {
try {
wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
this.value = value;
available = true;
notifyAll();
}
}
引用Object.wait
的文档:
此方法导致当前线程(称为 T)将自身置于该对象的等待集中,然后放弃对该对象的任何和所有同步声明。
本质上,wait
是一种特殊情况,允许其他线程在收到通知之前申请锁。