【问题标题】:Same condition logic generating two very different byte codes for AtomicBooleans in Java. Why?相同的条件逻辑为 Java 中的 AtomicBoolean 生成两个非常不同的字节码。为什么?
【发布时间】:2014-02-21 05:16:42
【问题描述】:

如果我这样做,我的程序运行良好:

if (atomicBoolean1.get() == false && atomicBoolean2.get() == true 
     && !atomicBoolean1.compareAndSet(false, true)) {

    continue;
}

现在,如果我这样做,一切都会中断:

if (atomicBoolean1.get() == false && atomicBoolean2.get() == true) {

    continue;
}

if (!atomicBoolean1.compareAndSet(false, true)) {

    continue;
}

我疯了吗?

【问题讨论】:

    标签: java multithreading concurrency cas locks


    【解决方案1】:

    continue 跳转到下一次迭代。

    两者都不相同。应该是一样的

    if (atomicBoolean1.get() == false && atomicBoolean2.get() == true) {   
      if (!atomicBoolean1.compareAndSet(false, true)) {
          continue;
      }
    }
    

    【讨论】:

    • 哇!!!!为什么?我有两个分支而不是一个?逻辑上是一样的,所以现在我很困惑。
    • 现在你的两个条件独立工作。您必须将它们相互关联。 :)
    • @JohnPristine,当您执行“继续”时,它不会转到“下一行”。也许你误解了“继续”的说法。
    • @anonymous 哦不。多么愚蠢的错误。我越来越老了。它们在逻辑上并不相同。对不起。 :(
    【解决方案2】:

    实际上,您在上述 2 种情况下所做的事情并不完全相同。

    在案例1中,

    atomicBoolean1.get() == false && atomicBoolean2.get() == true 
    

    如果只满足以上2个条件,

    atomicBoolean1.compareAndSet(false, true)
    

    函数正在调用。

    但在case2中,

    atomicBoolean1.get() == false && atomicBoolean2.get() == true 
    

    如果满足以上2个条件,它将返回循环开始。 所以不会调用

    atomicBoolean1.compareAndSet(false, true)
    

    如果仅这两个条件失败,它将调用

    atomicBoolean1.compareAndSet(false, true)
    

    我想,我可能会引起任何问题。

    让我们提供有关您的程序以及您正在尝试做什么的更多详细信息。 这可能有助于找出问题所在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多