Looking for java Keywords? Try Ask4Keywords

Java Language Происходит до отношений


пример

(Ниже приведена упрощенная версия того, что говорит спецификация языка Java. Для более глубокого понимания вам необходимо прочитать спецификацию.)

Случаи-до отношений являются частью модели памяти, которые позволяют нам понять и понять видимость памяти. Как говорит JLS ( JLS 17.4.5 ):

«Два действия могут быть упорядочены с помощью отношения« произойдет раньше » . Если произойдет одно действие - перед другим, то первое будет видимым и упорядоченным до второго».

Что это значит?

действия

Действия, указанные выше в цитируемой цитате, указаны в JLS 17.4.2 . Существует 5 видов действий, указанных в спецификации:

  • Чтение: чтение неизменяемой переменной.

  • Запись: запись нелетучей переменной.

  • Действия синхронизации:

    • Volatile read: Чтение изменчивой переменной.

    • Volatile write: запись изменчивой переменной.

    • Замок. Блокировка монитора

    • Разблокировка. Разблокировка монитора.

    • (Синтетическое) первое и последнее действие потока.

    • Действия, которые запускают поток или обнаруживают, что поток завершен.

  • Внешние действия. Действие, которое имеет результат, зависящий от среды, в которой программа.

  • Действия дивергенции потока. Они моделируют поведение определенных видов бесконечного цикла.

Заказ программы и синхронизация

Эти два порядка ( JLS 17.4.3 и JLS 17.4.4 ) управляют выполнением операторов в Java

Заказ программы описывает порядок выполнения инструкции в одном потоке.

Порядок синхронизации описывает порядок выполнения оператора для двух операторов, связанных синхронизацией:

  • Действие разблокировки на мониторе синхронизируется со всеми последующими действиями блокировки на этом мониторе.

  • Синхронизация записи в изменчивую переменную - со всеми последующими чтениями одной и той же переменной любым потоком.

  • Действие, которое запускает поток (т. Thread.start() Вызов Thread.start() ), синхронизируется с первым действием в Thread.start() потоке (т. Thread.start() метода run() потока).

  • По умолчанию инициализация полей синхронизируется с первым действием в каждом потоке. (См. JLS для объяснения этого.)

  • Заключительное действие в потоке синхронизируется с любым действием в другом потоке, который обнаруживает завершение; например, возврат вызова join() или isTerminated() который возвращает true .

  • Если один поток прерывает другой поток, вызов прерывания в первом потоке синхронизируется - с точкой, в которой другой поток обнаруживает, что поток был прерван.

Бывает-до заказа

Это упорядочение ( JLS 17.4.5 ) определяет, гарантируется ли запись в памяти для последующего чтения в памяти.

Более конкретно, чтение переменной v гарантируется наблюдением записи в v тогда и только тогда, когда write(v) происходит - перед read(v) И нет промежуточной записи в v . Если есть промежуточные записи, то read(v) может видеть результаты из них, а не предыдущие.

Правила, определяющие порядок до- заказа, следующие:

  • Happens-Before Rule # 1 - Если x и y - действия одного и того же потока, а x - до y в программном порядке , то x происходит до y.

  • Happens-Before Rule # 2 - Происходит до конца от конца конструктора объекта до начала финализатора для этого объекта.

  • Happens-Before Rule # 3 - Если действие x синхронизируется с последующим действием y, то x происходит до y.

  • Happens-Before Rule # 4 - Если x происходит - до того, как y и y произойдет - до z, то x произойдет - до z.

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