Re[4]: Вопрос на засыпку: синхронизация на разных volatile
От: seno  
Дата: 17.07.13 13:46
Оценка:
Здравствуйте, maxkar, Вы писали:

M>Забудьте про "нельзя реордерить". В Memory model реордеринги идут как "опциональное" объяснение и в формальной модели нигде не используются. В формальной модели используются happens-before relationship, для которого важно читать одну и ту же переменную. Запись/чтение разных volatile такую связь не создают, поэтому там можно увидеть все, что угодно. И связано это может быть не с реордерингами, а с кэшами.

В том то и дело, что создают! Вспомните, как релизованы мембары на уровни ОС? Разве там есть, условно, membar(variable)? Нет, там есть просто membar(). Он не ассоциирован ни с какой переменной или объектом. Это просто барьер. И все synchronized, lock и volatile в конечном счете создают именно такие "просто" барьеры.
Поэтому я могу абсолютно легально сказать, что запись в волатильную переменную A happens-before чтения волатильной переменной B — вещи, происходящие на низком уровне (флаши и инвалидации кэшей, барьеры) абсолютно идентичны.
Проблема в другом — пытаясь сделать это на разных волатильных переменных мы никак не можем узнать делаем ли мы чтение из волатильной переменной B до или после записи в волатильную A. То есть барьеры, флаши, happens-before — все это происходит. Но не происходит передача состояния. А с одной переменной у нас есть и happens-before, и передача состояния, по которому мы потом можем сделать if.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.