исключает ли использование synchronized, volatile?

142
29 августа 2018, 08:40

исключает ли использование synchronized, volatile?

Происходит ли сброс данных из кэшей по завершению synchronized блока, и используют ли другие потоки потом обновлённые данные непосредственно из оперативки (игнорируя свои кэши)

Answer 1

Да, обращение к неволатильным переменным из синхронизированного блока гарантирует видимость, упорядоченность и атамарность. Но стоит иметь ввиду, что вход в синхронизированный блок на много медленнее обращения к волатильной переменной.

Answer 2

volatile действительно позиционируется как легковесная альтернатива synchronized когда речь идет о доступе к одной переменной.

На более ранних реализациях JVM мне доводилось также наблюдать феномен, когда несинхронизированный код работал как синхронизированный, когда в нем был включен трейсинг в консоль; когда же трейсинг выключался, код переставал работать. имхо, это было связано с тем, что PrintStream.println синхронизирован.

Однако я не видел такой спеки, которая бы определяла, что потоки должны синхронизировать кэши с общей памятью. Более того, спецификация Memory Model говорит следующее:

An implementation is free to produce any code it likes, as long as all resulting executions of a program produce a result that can be predicted by the memory model.

т.е. если некая реализация JVM будет работать эффективнее не сбрасывая весь кэш, а лишь те переменные, которые требуются согласно спецификации, то код, опирающийся на недокументированное поведение - сброс кэша потока, вероятно перестанет работать корректно.

Т.о. даже если сброс кэша и происходит в некоторых реализациях JVM, он не гарантирован спецификацией и не стоит опираться на это поведение в своей программе.

READ ALSO
Авторизация в JSF Java EE

Авторизация в JSF Java EE

Пишу авторизацию пользователей в моем Web приложении на JSF, возникла проблема в том, что когда мы используем теги h:inputText & h:inputSecret, а потом...

194
Склейка ByteBuf'ов netty

Склейка ByteBuf'ов netty

Если я пишу длинный запрос на сервер, к примеру 5000 байтов, то приходит только 1024, а потом приходит остальная часть

182
FTP разные кодировки названий

FTP разные кодировки названий

Использую apache ftp client, но проблема в том, что на FTP файлы с разными кодировкамиВот вывод консоли, если я ставлю UTF-8:

187