有没有好的方法来实现synchronized关键字的异步版本?显然synchronized()关键字会频繁阻塞当前线程。例如:
public static boolean getLockSync(Runnable r) {
if (isLocked) {
r.run();
return true;
}
synchronized (My.lock) { // this is blocking, could block for more than 1-2 ms
isLocked = true;
r.run();
isLocked = false;
return false;
}
}
我可以从这个 block 返回一个 boolean 值——它是同步的。有没有办法异步执行此操作?
像这样:
public static void getLockAsync(Runnable r) {
if (isLocked) {
CompletableFuture.runAsync(r);
return;
}
Object.onLockAcquisition(My.lock, () -> { // this is non-blocking
isLocked = true;
r.run();
isLocked = false;
Object.releaseLock(My.lock);
});
}
我编写了 Object.onLockAcquisition 方法,但正在寻找类似的方法。
最佳答案
您是否研究过替代方案?根据您要实现的目标,以下一项或多项可能会有所帮助(或无帮助):
- 双重锁定替代方案(使用 volatile + monitor 并检查 volatile 两次,一次在锁定之前,一次在锁定之后)
- 使用 AtomicXXX 和 compareAndSet/compareAndExchange 等方法
- 使用 java.util.concurrent.locks
- 使用单线程执行器来执行临界区
- 使用队列
关于java - synchronized(){} 的异步(非阻塞)版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54568507/