Та же логика условий, генерирующая два очень разных байтовых кода для AtomicBooleans в Java. Зачем?

Если я делаю это, моя программа работает очень хорошо:

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 ответа

Решение

continue переходит к следующей итерации.

Они оба не одинаковы. То же самое должно быть

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

На самом деле вы не делаете точно такие же вещи в вышеупомянутых 2 случаях.

В случае 1,

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

если выполнены только 2 условия,

atomicBoolean1.compareAndSet(false, true)

функция вызывает.

Но в случае 2,

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

если выполнены 2 условия, он вернется к началу цикла. так не назовешь

atomicBoolean1.compareAndSet(false, true)

Если эти 2 условия не были выполнены, он вызовет

atomicBoolean1.compareAndSet(false, true)

Я думаю, я могу вызвать любую проблему.

Давайте расскажем подробнее о вашей программе и о том, что вы пытаетесь сделать. Это может помочь выяснить проблему.

Другие вопросы по тегам