有没有一种好的方法来实现 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;
}
}
我可以从这个块返回一个布尔值 - 它是同步的。有没有一种异步的方法来实现这一点?类似这样的东西:
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方法,但是正在寻找类似的方法。
if(isLocked)
也是不安全的。 - Fureeishr.run()
调用的那一刻之间它不会变为 false。 - Fureeishsynchronized
而不进行任何替换,您就可以得到您要求的内容。除非您除了说“非阻塞”之外还描述了任何有意义的东西。 - Holger