相同的条件逻辑为Java中的AtomicBooleans生成两个非常不同的字节代码。为什么?

时间:2014-02-21 05:16:43

标签: java multithreading concurrency cas locks

如果我这样做,我的程序工作得非常好:

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;
}

我疯了吗?

2 个答案:

答案 0 :(得分:3)

continue跳转到下一次迭代。

他们俩都不一样。同样应该是

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

答案 1 :(得分:0)

实际上,在上述两种情况下你并没有完全相同的事情。

在case1中,

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)

我想,我可能会有任何问题。

让我们提供有关您的计划以及您要执行的操作的更多详细信息。 它可能有助于找出问题。