Спецификация Java 11: 17.4.1. Общие переменные. 17.4.2. Действия

17.4.1. Общие переменные

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

Все поля экземпляра, статические поля и элементы массива хранятся в динамической памяти. В этой главе спецификации используется термин переменная для обозначения как полей, так и элементов массива.

Локальные переменные (§14.4), формальные параметры метода (§8.4.1) и параметры обработчика исключений (§14.20) никогда не используются совместно между потоками и не зависят от модели памяти.

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

17.4.2. Действия

Межпотоковое действие - это действие, выполняемое одним потоком, которое может быть обнаружено другим потоком или на которое может оказывать непосредственное влияние. Программа может выполнять несколько видов межпотокового действия:

  • Чтение (обычное или не-volatile). Чтение переменной.
  • Запись (обычная или не-volatile). Запись переменной.
  • Действия по синхронизации, а именно:
    • volatile чтение. volatile чтение переменной.
    • volatile запись. volatile запись переменной.
    • Блокировка. Блокировка монитора.
    • Разблокировка. Разблокировка монитора.
    • (Синтетическое) первое и последнее действие потока.
    • Действия, которые запускают поток или обнаруживают, что поток завершен (§17.4.4).
  • Внешние действия. Внешнее действие - это действие, которое можно наблюдать за пределами выполнения, и его результат зависит от внешней по отношению к выполнению среды.
  • Действия по расхождению потоков (§17.4.9). Действие по расхождению потока выполняется только потоком, который находится в бесконечном цикле, в котором не выполняется ни память, ни синхронизация, ни внешние действия. Если поток выполняет действие по расхождению потока, за ним последует бесконечное количество действий по расхождению потока.
    Действия по расхождению потоков представлены для моделирования того, как поток может вызвать остановку всех других потоков и сбой в выполнении.

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

Действие a описывается кортежем (tuple) < t, k, v, u >, содержащим:

  • t - поток, выполняющий действие
  • k - вид действия
  • v - переменная или монитор, задействованный в действии.
    Для действий блокировки v - блокируемый монитор; для действий разблокировки v - это разблокируемый монитор.
    Если действие является чтением (volatile или не-volatile), v - это читаемая переменная.
    Если действие представляет собой запись (volatile или не-volatile), v - это записываемая переменная.
  • u - произвольный уникальный идентификатор действия

Кортеж внешнего действия содержит дополнительный компонент, который содержит результаты внешнего действия, воспринимаемые потоком, выполняющим действие. Это может быть информация об успехе или неудаче действия, а также любые значения, считываемые действием.

Параметры внешнего действия (например, какие байты записываются в какой сокет) не являются частью кортежа внешнего действия. Эти параметры устанавливаются другими действиями внутри потока и могут быть определены путем изучения семантики внутри потока. Они не обсуждаются явно в модели памяти.

При выполнении без завершения не все внешние действия наблюдаемы. Неограниченные исполнения и наблюдаемые действия обсуждаются в §17.4.9.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки