Многие друзья, возможно, слышали о том, что ключевое слово летучие и, возможно, использовали его. До Java 5 это было противоречивое ключевое слово, так как использование его в программах часто приводило к неожиданным результатам. Только после Java 5 летучие ключевые слова восстановили свою жизненную силу.
Функция летучих ключевых слов состоит в том, чтобы сделать все потоки в системе общей общей работы, модифицированной переменными, модифицированными ключевым словом, и может запретить рабочую память потока из кэшированных переменных, модифицированных летучими.
Волатильный 2 сценарии использования:
1. Видимость: Java предоставляет летучие ключевые слова для обеспечения видимости.
Когда общая переменная изменяется летучейю часть, она гарантирует, что измененное значение будет обновлено до основной памяти немедленно, и когда другие потоки должны его прочитать, оно будет читать новое значение в памяти.
Тем не менее, обычные общие переменные не могут гарантировать видимость, потому что это неясно, когда нормальная общая переменная записывается в основную память после ее изменения. Когда другие потоки читают его, исходное старое значение все еще может быть в памяти, поэтому видимость не может быть гарантирована.
Кроме того, синхронизированный и блокировка также могут обеспечить видимость. Синхронизированный и блокировка может убедиться, что только один поток получает блокировку одновременно и выполняет код синхронизации. Прежде чем выпустить блокировку, модификация переменной будет обновлена в основную память. Поэтому видимость может быть гарантирована.
Давайте сначала посмотрим на кусок кода. Если поток 1 выполняется первым, а поток 2 выполняется позже:
// потока 1Boolean Stop = false; while (! Stop) {dosomething ();} // потока 2stop = true;Этот код является очень типичным куском кода, и многие люди могут использовать этот метод разметки при прерывании потоков. Но на самом деле этот код работает полностью правильно? Будет ли поток прерван? Не обязательно. Возможно, большую часть времени этот код может прерывать потоки, но он также может привести к прерыванию поток (хотя эта возможность очень мала, как только это произойдет, это приведет к мертвому петлю).
Давайте объясним, почему этот код может привести к тому, что поток не прервел. Как объяснялось ранее, каждый поток имеет свою собственную рабочую память во время работы, поэтому при запуске потока 1 он скопирует значение переменной Stop и помещает ее в свою собственную рабочую память.
Затем, когда поток 2 изменяет значение переменной остановки, но у меня не было времени, чтобы написать ее в основную память, поток 2 делает другие вещи, тогда поток 1 не знает об изменениях потока 2 в переменной остановки, поэтому он будет продолжать цикл.
Но после изменения с летучим он становится другим:
Во -первых: использование летучих ключевых слов заставит немедленно записано в основную память в основную память;
Во -вторых: если вы используете летучие ключевое слово, когда поток 2 изменяет его, линия кэша остановки переменной кэша в рабочей памяти потока 1 будет недействительной (если она отражена в аппаратном слое, соответствующая линия кэша в кэше L1 или L2 в CPU является недостаточной);
ТРЕТЬЯ: Поскольку строка кэша остановки переменной кэша в рабочей памяти потока 1 недействительна, поток 1 будет считывать ее в основной памяти, когда она снова считывает значение остановки переменной.
Затем, когда поток 2 изменяет значение остановки (конечно, здесь есть 2 операции, изменяя значение в рабочей памяти потока 2, а затем написание модифицированного значения в память), строка кэша остановки переменной кэша в рабочей памяти потока 1 будет недействительной. Когда нить 1 читается, он обнаруживает, что его линия кэша недействительна. Он будет ждать обновления соответствующего основного адреса памяти линии кэша, а затем прочтет последнее значение в соответствующей основной памяти.
Затем то, что считывает поток 1, является последним правильным значением.
2. Обеспечить упорядоченность
volatile boolean initification = false; // поток 1: context = LoadContext (); инициировано = true; // потока 2: while (! Inited) {sleep ()} dosomethingwithconfig (context);Убедитесь, что контекст был инициализирован.
3. Добромой чек
Класс Singleton {private volatile Static Singleton Encament = null; private singleton () {} public static singleton getInstance () {if (ancement == null) {synchronized (singleton.class) {if (ancement = null) encement = new Singleton ();} return;}}}}}}}}}}}}}}}Выше приведено подробное объяснение роли и использования летучивого ключевого слова в Java, представленном вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!