Я использую Android Studio (intelliJ-idea) для разработки Android. Я получаю предупреждение за этот кусок кода:Многопоточная Java - синхронизация - предупреждение Android Studio
if (status == STATUS_SOLVING) {
if (!solverThread.isAlive())
if (status != STATUS_SOLVED) // <<<<<< WARNING THIS LINE
status = STATUS_DATA_COLLECTING;
}
линия указано выше, дает мне предупреждение о том, что это условие всегда истинно. Я могу понять, почему это верно, если вся программа работает в одном потоке.
Но поскольку моя программа использует параллельный поток для изменения значения status
, не означает ли это, что это условие может измениться между строкой # 1 и # 3 в фрагменте выше?
Действительно ли это предупреждение? Я что-то упускаю?
Что-то изменится, если я ввожу вложенные ifs в один сингл, если с оператором &&
?
Спасибо! Можете ли вы также рассмотреть ответ на вторую часть? Замена вложенных if с помощью оператора &&. – Kasra
Не изменится, компилятор будет оптимизировать в любом случае - если переменная нестабильна, и в этом случае она будет каждый раз загружать свое значение из ОЗУ. В общем, это действительно опасный код, хотя я могу видеть 3 или 4 условия гонки только во фрагменте, который вы мне дали. Если у вас нет опыта работы с многопоточными и гоночными условиями, я предлагаю получить обзор кода у кого-то, кто это делает. –
Это был просто эксперимент ... Я планировал использовать объекты блокировки (синхронизация (блокировка)). Я считаю, что это решение для этой конкретной проблемы, поскольку я изменяю «статус» на основе полученных значений «статус», поэтому я заблокирую этот сегмент кода. Но в любом случае, спасибо за разъяснения в отношении предупреждения и оптимизации байт-кода. – Kasra