Есть ли у создания нового потока побочный эффект очистки кэша? - PullRequest
6 голосов
/ 14 декабря 2011

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

  1. Поток запускается и устанавливает переменную X.
  2. Тема создает новую тему.
  3. Новый поток обращается к X.

Мой вопрос таков: гарантированно ли новый поток, в момент его создания или в момент начала выполнения, видеть обновление, выполненное для X старым потоком в шаге 1? Я понимаю, что если старый поток изменит значение X в будущем, это не гарантирует, что новый поток увидит эти изменения. Все в порядке. Я просто хочу знать, будет ли новый поток видеть правильные значения при запуске без необходимости явной синхронизации.

Когда я впервые решил изучить эту тему, я подумал, что простой поиск в Google сразу же покажет ответ, но по какой-то причине я не могу найти какой-либо результат, который отвечает на этот вопрос.

1 Ответ

9 голосов
/ 14 декабря 2011

Да, это так.

В java существует отношение «происходит до», которое определяет, какие эффекты памяти видны между двумя действиями. Если «происходит до B», то действие B гарантированно увидит все изменения, сделанные действием A.

Запуск потока создает отношение «происходит до» между вызовом «thread.start ()» и всем кодом, который выполняется в новом потоке. Поэтому новый поток гарантированно увидит эффект памяти изменения переменной X в первом потоке.

Для быстрого обзора отношения «до и после» см. Видимость памяти часть обзора пакета java.util.concurrent В вашем случае интересные биты:

  • Каждое действие в потоке происходит перед каждым действием в этом потоке, которое происходит позже в порядке программы.
  • Вызов для запуска в потоке происходит до любого действия в запущенном потоке.

Дополнительные ссылки, если вам интересно:

...