исключает ли использование synchronized
, volatile
?
Происходит ли сброс данных из кэшей по завершению synchronized
блока, и используют ли другие потоки потом обновлённые данные непосредственно из оперативки (игнорируя свои кэши)
Да, обращение к неволатильным переменным из синхронизированного блока гарантирует видимость, упорядоченность и атамарность. Но стоит иметь ввиду, что вход в синхронизированный блок на много медленнее обращения к волатильной переменной.
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, он не гарантирован спецификацией и не стоит опираться на это поведение в своей программе.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Пишу авторизацию пользователей в моем Web приложении на JSF, возникла проблема в том, что когда мы используем теги h:inputText & h:inputSecret, а потом...
Если я пишу длинный запрос на сервер, к примеру 5000 байтов, то приходит только 1024, а потом приходит остальная часть
Использую apache ftp client, но проблема в том, что на FTP файлы с разными кодировкамиВот вывод консоли, если я ставлю UTF-8: