Возможно, похожий вопрос:
Вы когда-нибудь использовали ключевое слово volatile в Java?
Сегодня я отлаживал свою игру; У него была очень трудная проблема с многопоточностью, которая появлялась каждые несколько минут, но ее было трудно воспроизвести. Итак, сначала я добавил ключевое слово
synchronized
к каждому из моих методов. Это не сработало. Затем я добавил ключевое слово
volatile
в каждое поле. Проблема, казалось, просто исправилась.
После некоторых экспериментов я обнаружил, что ответственным полем был объект GameState
, который отслеживал текущее состояние моей игры, которое может быть либо занятым, либо занятым. Когда занято, игра игнорирует пользовательский ввод. У меня был поток, который постоянно менял переменную state
, в то время как поток событий считывал переменную state
. Однако после того, как один поток изменяет переменную, другому потоку требуется несколько секунд, чтобы распознать эти изменения, что в конечном итоге вызывает проблему.
Это было исправлено с помощью переменной состояния volatile
.
Почему в Java переменные volatile
не являются переменными по умолчанию и в чем причина не использовать ключевое слово volatile
?