如果线程 A 访问线程 B 的方法,而该方法恰好正在等待某个条件,那么线程 A 会卡在该方法中吗?我怎样才能让线程 A 实际上检查线程 B 是否正在等待条件,因此也被条件挂起,并在完成时收到线程 B 条件的信号?
基本上,我想知道如何防止嵌套条件阻止调用嵌套调用(线程间)的父方法。
例如:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Person {
final Lock lock = new ReentrantLock();
Condition isFree = lock.newCondition();
State state;
public void eat() throws InterruptedException {
lock.lock();
try {
while (state != State.WAITING) {
isFree.await();
}
//begin eating
state = State.EATING;
Thread.sleep(1000);
state = State.WAITING;
isFree.signal();
} finally {
lock.unlock();
}
}
public void feed(Person person) throws InterruptedException {
lock.lock();
try {
while (state != State.WAITING) {
isFree.await();
}
//begin intention to feed
person.eat();
} finally {
lock.unlock();
}
}
enum State {
EATING, WAITING;
}
}
在上面的示例中,可能会发生每个 Person 对象都在喂养另一个对象,因此陷入竞争状态。
谢谢!
最佳答案
看看 tryLock()
java.util.concurrent.locks.Lock
上的方法。这允许您尝试获取锁,但如果失败则返回(在可选的超时之后),而不是阻塞。
关于java - 监视器和锁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5214579/