我正在尝试 Leetcode 中的一个简单的并发问题。我在大学里非常简要地研究过这个主题,但没有使用 Java API。似乎我不能在ReentrantLock
不Lock
遇到IllegalMonitorStateException
. 然而 a Semaphore
(这似乎有点矫枉过正,因为我只需要使用二进制值)似乎工作正常。为什么是这样?
二进制信号量与 ReentrantLock建议(如果我理解正确的话)二进制锁只能由获取它的线程释放,这可能是我的问题的根源,因为我在下面的代码中的构造函数中获取它们。有没有其他自然的方法可以使用锁/不使用信号量来解决这个问题?
Lock
带有引发 s 的代码IllegalMonitorStateException
:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Foo {
private Lock printedFirst;
private Lock printedSecond;
public Foo() {
this.printedFirst = new ReentrantLock();
this.printedSecond = new ReentrantLock();
printedFirst.lock();
printedSecond.lock();
}
public void firs
Semaphore带有按预期工作的 s 的代码:
import java.util.concurrent.Semaphore;
class Foo {
private Semaphore printedFirst;
private Semaphore printedSecond;
public Foo() {
this.printedFirst = new Semaphore(0);
this.printedSecond = new Semaphore(0);
}
public void first(Runnable printFirst) throws InterruptedException {
printFirst.run();
printedFirst.release();
}
public void second(Runnable printSecond) throws InterruptedException {
printedFirst.acquire();
try {
printSecond.run();
} finally {
printedSecond.release();
}
}
public void third(Runnable printThird) throws InterruptedException {
printedSecond.acquire();
try {
printThird.run();
} finally {}
}
}
t(Runnable printFirst) throws InterruptedException {
printFirst.run();
printedFirst.unlock();
}
public void second(Runnable printSecond) throws InterruptedException {
printedFirst.lock();
try {
printSecond.run();
} finally {
printedSecond.unlock();
}
}
public void third(Runnable printThird) throws InterruptedException {
printedSecond.lock();
try {
printThird.run();
} finally {}
}
}
蝴蝶不菲
森林海
红糖糍粑
相关分类