Java相当于ManualResetEvent吗?
2022-09-01 07:29:58
Java相当于ManualResetEvent吗?
class ManualResetEvent {
private final Object monitor = new Object();
private volatile boolean open = false;
public ManualResetEvent(boolean open) {
this.open = open;
}
public void waitOne() throws InterruptedException {
synchronized (monitor) {
while (open==false) {
monitor.wait();
}
}
}
public boolean waitOne(long milliseconds) throws InterruptedException {
synchronized (monitor) {
if (open)
return true;
monitor.wait(milliseconds);
return open;
}
}
public void set() {//open start
synchronized (monitor) {
open = true;
monitor.notifyAll();
}
}
public void reset() {//close stop
open = false;
}
}
据我所知,最接近的是信号量。只需将其与“许可证”计数1一起使用,aquire/release将与您从中了解到的几乎相同。ManualResetEvent
初始化为 1 的信号量(其使用方式使其最多只有一个许可证可用)可以用作互斥锁。这通常被称为二进制信号量,因为它只有两种状态:一个许可证可用,或零个许可证可用。以这种方式使用时,二进制信号量具有属性(与许多 Lock 实现不同),即“lock”可以由所有者以外的线程释放(因为信号量没有所有权概念)。这在某些特殊情况下很有用,例如死锁恢复。