В чем разница в использовании ключевого слова volatile в java4 и java5 и далее?
JMM до того, как JDK5 сломан, и использование volatile для JDK4 может не дать ожидаемого результата. Для более проверить это: http://www.ibm.com/developerworks/library/j-jtp02244/
операции чтения/записи на неатомарных переменных (длинный/двойной) атомарные, когда они объявлены как изменчивы.
Чтение/запись для длинных/двойных событий происходит как две отдельные 32-битные операции. Для двух потоков возможно, что один поток считывает более высокие 32-битные, а другой имеет более низкие 32 бита длинной/двойной переменной. Короче говоря, чтение/запись по длине - это не атомная операция, в отличие от других примитивов. Использование volatile для long/double должно обеспечивать такую гарантию, поскольку инструкции для volatile не переупорядочены для изменчивого чтения/записи компилятором, а volatile также обеспечивает гарантию видимости. Но снова это может не работать для JDK 4 или раньше.
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile – Luciano
Почему вы предполагаете, что существуют какие-либо различия между java4 и java5, связанными с ключевым словом volatile? – claesv
@claesv потому что есть. Модель памяти Java изменилась между этими версиями. – Luciano