Модель памяти Java Happens Before

Слайд 2

www.andersenlab.com Модель памяти — это способ объединения кода, данных и стека

www.andersenlab.com

Модель памяти — это способ объединения кода, данных и стека программы

в один или несколько физических сегментов.

Модель памяти Java, используемая внутри JVM, разделяет память между стеками потоков и кучей (heap). Каждый поток, выполняющийся в виртуальной машине Java, имеет свой собственный стек потока.

Слайд 3

www.andersenlab.com

www.andersenlab.com

Слайд 4

www.andersenlab.com Проблемы Visibility Чтение/запись данных потоками из разных областей памяти Reordering

www.andersenlab.com

Проблемы

Visibility
Чтение/запись данных потоками из разных областей памяти
Reordering
действия, выполненные одним потоком, другой

поток увидит в другом порядке
Atomicity
не атомарная запись данных
Слайд 5

www.andersenlab.com Happens Before отношение строгого частичного порядка, введённое между атомарными командами

www.andersenlab.com

Happens Before

отношение строгого частичного порядка, введённое между атомарными командами и не

означающее «физически прежде». Оно значит, что вторая команда будет «в курсе» изменений, проведённых первой.
Слайд 6

www.andersenlab.com Освобождение монитора happens-before заполучение того же самого монитора. before

www.andersenlab.com

Освобождение монитора happens-before заполучение того же самого монитора.

before

Слайд 7

www.andersenlab.com Всё, что в том же потоке перед записью в volatile-переменную,

www.andersenlab.com

Всё, что в том же потоке перед записью в volatile-переменную, и

сама запись. Запись в volatile переменную happens-before чтение из той же самой переменной.
Слайд 8

www.andersenlab.com Запись значения в final-поле (и, если это поле — ссылка,

www.andersenlab.com

Запись значения в final-поле (и, если это поле — ссылка, то

ещё и всех переменных, достижимых из этого поля (dereference-chain)) при конструировании объекта happens-before запись этого объекта в какую-либо переменную, происходящая вне этого конструктора.
Слайд 9

www.andersenlab.com Другие гарантии Статическая инициализация happens before любые действия с любыми

www.andersenlab.com

Другие гарантии
Статическая инициализация happens before любые действия с любыми экземплярами объектов.
Любая

работа с объектом happens before finalize().
Start() happens before run() before
Код в потоке happens before join();
код в потоке happens before isAlive() == false.
interrupt() потока happens before обнаружение факта остановки.