Та же логика условий, генерирующая два очень разных байтовых кода для 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)
Я думаю, я могу вызвать любую проблему.
Давайте расскажем подробнее о вашей программе и о том, что вы пытаетесь сделать. Это может помочь выяснить проблему.