java - synchronized(){} 的异步(非阻塞)版本

标签 java akka vert.x

有没有好的方法来实现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/

相关文章:

java - 获取类外 JPanel 的宽度和高度

java - 无法在 JNI 项目中加载 .so

java - 如何更改spring mockmvc的http端口

java - 如何使用 Java/Android 让按钮打开另一个应用程序?

Java Hashcode 导致整数溢出

scala - 使用包含 self 类型的 Prop 创建 Actor

scala - Akka 上下文观察/取消观察发生在关系之前

scala - 在 Spray 路由中调用 Actor 并等待 Actor 的响应

javascript - VertX Webserver 静态内容 webroot

hazelcast - vert.x 事件总线在扩展方面是否有限制