首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免布尔翻转的同步块

避免布尔翻转的同步块
EN

Stack Overflow用户
提问于 2019-02-14 17:22:07
回答 2查看 76关注 0票数 1

我有这个方法:

代码语言:javascript
运行
复制
  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()吗?

我相信布尔值的赋值是原子的,所以一次只有一个线程可以这么做。

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

EN

回答 2

Stack Overflow用户

发布于 2019-02-14 17:25:14

有一种方法可能会让它稍微加速一点,那就是这样做:

代码语言:javascript
运行
复制
  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块。

票数 0
EN

Stack Overflow用户

发布于 2019-02-14 18:00:49

也许可以使用AtomicBoolean而不是boolean来避免同步块

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54686941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档