java - 避免 boolean 翻转的同步块(synchronized block)

标签 java concurrency

我有这个方法:

  public void lock(Asyncc.IAsyncCallback<Unlock, Object> cb) {

    synchronized (this) {
      if (this.locked) {
        this.queue.add(cb);
        return;
      }

      this.locked = true;
    }

    cb.done(null, this.makeUnlock(true));

  }

我可以使用一些技巧来避免synchronized()调用吗?

我相信分配一个 boolean 值是原子的,因此一次只有一个线程可以执行此操作。

我们的想法是避免 2 个线程获取锁。我们也不希望两个不同的代码路径获取锁,即使它们位于同一线程中。

最佳答案

一种可能加快速度的方法是执行以下操作:

  public void lock(Asyncc.IAsyncCallback<Unlock, Object> cb) {

    boolean add = false;
    synchronized (this) {
      if (this.locked) {
        add = true;
      }
      else {
        this.locked = true;
      }
    }

    if(add){
      this.queue.add(cb);
      return;
    }

    cb.done(null, this.makeUnlock(true));

  }

但我仍然不知道是否有办法避免同步块(synchronized block)。

关于java - 避免 boolean 翻转的同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54686941/

相关文章:

java - 使用apache POI在word文件生成中保留换行符

java - 关于任务 onPostExecute

java - 生产者-消费者队列能够将项目移到前面

java - 使用 ExecutorService 控制任务执行顺序

Java - 任务和 future - 我需要捕获异常还是可以将它们留给应用程序线程?

java - 确定骑士守卫的平方数

java - 我应该在哪里存储我的 java 应用程序访问第三方服务的凭据?

java - 概念 : Build Java Program and load it into Oracle DB - Wrapper function calls java function with return

java - 在构造函数中填充大量数据是不好的做法吗?

Java Swing 应用程序 : how to get data from the GUI thread to another thread?