Ниже приведены всего три правила JMM «случается до». Я не перечисляю другие правила, так как мой вопрос касается только этих трех правил.
- Правило блокировки монитора. Разблокировка блокировки монитора происходит перед каждой последующей блокировкой той же блокировки монитора.
- Правило начала потока. Вызов Thread.start в потоке происходит перед каждым действием в запущенном потоке.
- Правило прерывания. Поток, вызывающий прерывание в другом потоке, происходит до того, как прерванный поток обнаружит прерывание (либо путем создания InterruptedException, либо путем вызова isInterrupted или interrupted).
Вопросы
1-й вопрос правила. Предположим, что два потока A и B имеют синхронизированные блоки кода. Означает ли первое правило, что любая переменная, установленная в синхронизированном блоке в потоке A, будет видна коду в синхронизированном блоке потока B, даже если переменная НЕ объявлена как volatile?
Второй вопрос правила. Допустим, поток A запускает поток B. Означает ли второе правило, что любая переменная, установленная в родительском потоке перед вызовом start(), будет видна потоку B, даже если переменная НЕ объявлен как изменчивый?
3-й вопрос правила. Допустим, поток A прерывает поток B. Означает ли третье правило, что любая переменная, установленная в потоке A до прерывания потока B, будет видна потоку B после обнаружения прерывания, даже если переменная не объявлена как volatile?
Наконец, еще один вопрос:
- В документации BlockingQueue сказано:
#P7#
Означает ли это, что любая переменная, установленная в потоке A перед помещением объекта в очередь блокировки, будет видна потоку B после удаления объекта из очереди, даже если переменная НЕ объявлена как volatile?
В основном с помощью приведенных выше вопросов я пытаюсь понять, происходит ли сброс памяти после этих событий, так что в этих случаях переменные не нужно объявлять как изменчивые.