Спецификация Java 11: 17.4.3. Программы и порядок программ

Среди всех межпотоковых действий, выполняемых каждым потоком t, программный порядок t является общим порядком, который отражает порядок, в котором эти действия будут выполняться в соответствии с внутрипотоковой семантикой t.

Набор действий является последовательным, если все действия происходят в общем порядке (порядке выполнения), который согласуется с порядком выполнения программы, и, кроме того, каждое чтение r переменной v видит значение, записанное записью w в v таким образом, что:

  • w стоит перед r в порядке выполнения, и
  • нет другой записи w' такой, что w предшествует w', а w' предшествует r в порядке выполнения.

Последовательная согласованность - это очень надежная гарантия видимости и упорядоченности выполнения программы. В рамках последовательно согласованного выполнения существует общий порядок всех отдельных действий (таких как чтение и запись), который согласуется с порядком выполнения программы, и каждое отдельное действие является атомарным и сразу видно каждому потоку.

Если в программе нет гонок данных, то все выполнения программы будут выглядеть последовательно согласованными.

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

Если бы использовалась последовательная согласованность в качестве модели памяти Java, многие из обсуждаемых оптимизаций компилятора и процессора были бы незаконными. Например, в трассировке в таблице ниже, как только произойдет запись 3 в p.x, потребуются последующие чтения из этого места, чтобы увидеть это значение.

Изначально p == q и p.x == 0.

Поток 1 Поток 2
r1 = p; r6 = p;
r2 = r1.x; r6.x = 3;
r3 = q;
r4 = r3.x;
r5 = r1.x;

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


Комментарии

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

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

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

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