Как стать автором
Обновить

Комментарии 10

Ещё раз, что такое volatile?

Из документации мы можем узнать, что ключевое слово volatile:

  1. Предотвращает использование кэша для разных потоков, тем самым гарантируя, что изменения в переменной будут сразу видны всем потокам;

  2. Устанавливает happens-before отношение между переменной и чтениями/записью рядом, тем самым запрещая производить оптимизации, основанные на изменении порядка операций.

  1. Укажите пожалуйста, где в документации на которую Вы сами и сослались и даже ссылку добавили, упоминания о "Предотвращает использование кэша для разных потоков"?

  2. Так запрещает использовать кэш или запрещает оптимизации или запрещает все на свете на всякий случай?

  1. Собственно, вот.

This means that changes to a volatile variable are always visible to other threads

Формулировка, очевидно, совпадает не стопроцентно. Но если усреднить, то можно читать это как "Изменения видны всем потокам, вместо использования независимых чтений/записей закешированных значений каждым отдельным потоком."

  1. Там же, следующее предложение. Действительно всё и сразу.

What's more, it also means that when a thread reads a volatile variable, it sees not just the latest change to the volatile, but also the side effects of the code that led up the change.

Формулировка, очевидно, совпадает не стопроцентно. Но если усреднить, то можно читать это как "Изменения видны всем потокам, вместо использования независимых чтений/записей закешированных значений каждым отдельным потоком."

Там английским по белому написано что "изменения volatile переменных видны другими потоками", как у вас получается читать в этой фразе "закешированных значений каждым отдельным потоком "?

Можете расшифровать что значит фраза:"Изменения видны всем потокам, вместо использования независимых чтений/записей закешированных значений каждым отдельным потоком." ?

как у вас получается читать в этой фразе "закешированных значений каждым отдельным потоком "?

Никак. Это не прямая цитата, если это то, что вы хотели услышать :). Я сослался на ту часть документации, которая говорит о следствии - изменения сразу видны другим потокам.

Можете расшифровать что значит фраза:"Изменения видны всем потокам, вместо использования независимых чтений/записей закешированных значений каждым отдельным потоком." ?

По умолчанию потоки копируют значения переменных в свои кэши и работают с ним. Без volatile они бы продолжали использовать локальные кэши, и другие потоки никаких изменений сразу бы не увидели. Собственно, о том и мой пример. Похожий можно найти в спецификации (17.3).

А что такое кэш потока?

Зависит от того, о каком уровне абстракции мы говорим :). Java на уровне спецификации позволяет потокам (процессора) иметь свой кэш. И в конкретном случае скорее всего это будет именно кэш и регистры процессора.

На уровне Java:)

Я может быть и не прав, но по-моему нету такого в доке явы. По крайней мере на уровне модели памяти. Хотя может быть на уровне реализации конкретной виртуальной машины под конкретную архитектуру это и есть.

Ну вот поэтому нам и важны абстракции :)
В спецификации действительно довольно расплывчатое определение этих механизмов, и конкретная реализация может отличаться в зависимости от железа и низкоуровневой настройки системы. Тем не менее, эти понятия в документации встречаются - в уже упомянутой выше jls упоминания кэшей значений в регистрах встречается тут и там.

Вы раз за разом рассказываете спецификацию "своими словами" при этом не можете на эту самую спецификацию сослаться. Сейчас пишите про "расплывчатое определение". Ссылаетесь на часть спецификации где просто есть слова "cached" и "registers".

Почему так сложно признать что на деле слабо понимаете как работает volatile?

Мне хочется признаться, что я уже сообщения со второго потерял нить разговора. И именно поэтому я раз за разом повторяю одно и то же разными словами.
Если я допустил ошибку или серьёзную неточность, то буду рад её исправить, если на неё укажете - я действительно мог что-то упустить.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий