Ссылка на MS:Вход по гиперссылке виден.
Ключевое слово «волатильное» указывает на то, что поле может быть изменено несколькими потоками, выполняющимися одновременно. Поля, объявленные летучими, не ограничены оптимизацией компилятора (при условии, что к ним обращается один поток). Это гарантирует, что поле отображается с последним значением в любое время.
Волатильный модификатор обычно используется для полей, к которым обращаются несколько потоков, но которые не сериализируют доступ с помощью оператора блокировки.
Волатильные ключевые слова можно применять к следующим типам полей:
- Тип цитирования.
- Тип указателя (в небезопасном контексте). Обратите внимание, что хотя сам указатель может быть изменяемым, объект, на который он указывает, не может быть изменяемым. Другими словами, «указатель на изменяемый объект» не может быть объявлен.
- Такие типы, как sbyte, byte, short, ushort, int, uint, char, float и bool.
- Тип enum с одним из следующих базовых типов: byte, sbyte, short, ushort, int или uint.
- Общие параметры типа, известные как эталонные типы.
- IntPtr и UIntPtr.
Переменные ключевые слова можно применять только к полям класса или структуры.Локальные переменные нельзя объявить как волатильные。
Хватит чепухи, напишите цикл, чтобы проверить:
Давайте проверим это 10 000 раз по кругу,Обнаружил, что вывод значений A верен, но,Это не объясняетЛетучие — безопасны для нитокПотому что, если проверить это много раз, можно увидеть, что будут ошибки в расчёте! Потому что есть вероятность правильного результата и вероятность неправильного результата
Код:
Давайте ещё раз проверим 100 000 циклов, и мы увидим, что значение a неверно, потому что чем меньше количество циклов, тем меньше вероятность ошибки, и ошибка не так очевидна, как ошибки не было после 10 000 циклов только что.
В этот момент мы добавляем замок для проверки, и становится видно, что значение a вычислено правильно, как мы и ожидали.
Код:
Резюме: волатильность не гарантирует безопасность потока, как видно в приведённом выше примере.
|