Эрик, я читал ваши комментарии, и один из них меня особенно поражает.
На самом деле, я могу понять использование volatile на концептуальном уровне. Но для практики я не могу придумать код с проблемами параллелизма без использования volatile
Очевидная проблема, с которой вы можете столкнуться, - это переупорядочение компилятора, например, более известный подъем, упомянутый Саймоном Никерсоном. Но допустим, что перестановок не будет, что комментарий может быть действительным.
Другая проблема, которую решает volatile, связана с 64-битными переменными (long, double). Если вы записываете в long или double, они рассматриваются как два отдельных 32-битных хранилища. Что может произойти с параллельной записью, так это то, что старшие 32 одного потока записываются в старшие 32 бита регистра, в то время как другой поток записывает младшие 32 бита. Можно потом иметь лонг что ни то ни другое.
Кроме того, если вы посмотрите на раздел памяти JLS, вы обнаружите, что это нестрогая модель памяти.
Это означает, что запись может не стать видимой (может находиться в буфере хранилища) какое-то время. Это может привести к устаревшим чтениям. Теперь вы можете сказать, что это кажется маловероятным, и это так, но ваша программа неверна и может дать сбой.
Если у вас есть int, который вы увеличиваете на время жизни приложения, и вы знаете (или, по крайней мере, думаете), что int не будет переполняться, вы не обновляете его до long, но все же возможно, что это возможно. В случае проблемы с видимостью памяти, если вы считаете, что это не должно повлиять на вас, вы должны знать, что это все еще может и может вызвать ошибки в вашем параллельном приложении, которые чрезвычайно трудно идентифицировать. Правильность является причиной использования volatile.
person
John Vint
schedule
28.04.2011
volatile
(и многие другие аспекты, связанные с параллелизмом) очень трудно продемонстрировать, потому что при неправильном использовании они может по-прежнему работать правильно и не показывать проблему. пока не возникнет очень специфическое условие, которое приведет к проблеме. - person Joachim Sauer   schedule 28.04.2011