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