Спецификация 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; |
Читайте также:
- Спецификация Java 11: 17.3. Sleep и Yield
- Спецификация Java 11: 17.4. Модель памяти
- Спецификация Java 11: 17.4.1. Общие переменные. 17.4.2. Действия
Комментарии
Отправить комментарий