Java 8 重入锁和条件导致 IllegalMonitorStateException:当前线程不是所有者
Java 8 Reentrant Lock and Condition results in IllegalMonitorStateException: current thread is not owner
我已经在这里搜索过这个错误,但我认为我的代码看起来是正确的:
- 我在 try..finally 之外获得了锁
- 我在finally部分有一个解锁
- 我只尝试等待锁内的条件。
- 如果当前锁被该线程持有并且它 returns 为真,我什至打印。
这是代码的摘录,如果我尝试 运行 我得到的代码 java.lang.IllegalMonitorStateException:当前线程不是所有者。
错误在 cond.wait() 方法中。
public void takeARest() {
lock.lock();
try {
while (disembark < totalPassengers) {
System.err.printf("Held by %s%n",lock.isHeldByCurrentThread());
cond.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
有什么想法吗?
你想要的 Condition.await()
。
Object.wait()
是一种不同的方法,需要持有对象的监视器(synchornized(cond){}
调用周围)
所以:
public void takeARest() {
lock.lock();
try {
while (disembark < totalPassengers) {
System.err.printf("Held by %s%n",lock.isHeldByCurrentThread());
cond.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
我已经在这里搜索过这个错误,但我认为我的代码看起来是正确的:
- 我在 try..finally 之外获得了锁
- 我在finally部分有一个解锁
- 我只尝试等待锁内的条件。
- 如果当前锁被该线程持有并且它 returns 为真,我什至打印。
这是代码的摘录,如果我尝试 运行 我得到的代码 java.lang.IllegalMonitorStateException:当前线程不是所有者。 错误在 cond.wait() 方法中。
public void takeARest() {
lock.lock();
try {
while (disembark < totalPassengers) {
System.err.printf("Held by %s%n",lock.isHeldByCurrentThread());
cond.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
有什么想法吗?
你想要的 Condition.await()
。
Object.wait()
是一种不同的方法,需要持有对象的监视器(synchornized(cond){}
调用周围)
所以:
public void takeARest() {
lock.lock();
try {
while (disembark < totalPassengers) {
System.err.printf("Held by %s%n",lock.isHeldByCurrentThread());
cond.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}