有没有实现异步关键字的同步关键字的好方法?显然,关键字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;
    }

  }

我可以从该块返回一个 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
  • 使用单线程执行程序执行关键部分
  • 使用队列
  • 07-24 13:42