Что значит «действия синхронизации полностью упорядочены»? - PullRequest
4 голосов
/ 24 января 2020

Я читаю Java Параллелизм на практике , в "16.1.3 Java Модель памяти в 500 словах или меньше", это говорит:

Java Модель памяти задается в терминах действий, которые включают чтение и запись в переменные, блокировки и разблокировки мониторов, а также запуск и соединение с потоками. JMM определяет частичное упорядочение , называемое случаем раньше, для всех действий в программе. Чтобы гарантировать, что поток, выполняющий действие B, может видеть результаты действия A (независимо от того, A или нет). (B происходят в разных потоках), между A и B. должно быть отношение «до и после». При отсутствии порядка «до» между двумя операциями JVM может переупорядочивать их по своему усмотрению.

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

О «частичном упорядочении» я обнаружил это и это , но я не не совсем понимаю "Несмотря на то, что действия упорядочены лишь частично, действия по синхронизации - получение и отпускание блокировки, d читает и записывает изменчивые переменные - полностью упорядочены. ". Что означает "действия по синхронизации полностью упорядочены" означает?

1 Ответ

4 голосов
/ 25 января 2020

Анализируя утверждение "действия синхронизации полностью упорядочены":

  • "действия синхронизации" - это набор S программных операций (действий)
  • у нас есть отношение R over set S: это отношение «до и после». То есть данные программные операторы a и b, aRb в том и только в том случае, если a происходит до b.

Тогда то, что говорится в утверждении, является "отношением R равно всего по S ".


" отношение R равно S ", что означает, что для каждых двух операций a,b из набора Sa!=b), либо aRb, либо bRa. То есть, либо a происходит до b, либо b происходит до a.


Если мы определим набор S как набор всех захватов и разблокировок, выполненных для одного и того же объекта блокировки X; тогда набор S равен полностью , упорядоченный отношением «случай до»: пусть будет a получение блокировки X, выполненной потоком T1, и b получение блокировки, выполненной нить T2. Затем происходит либо a - до b (в случае, если T1 сначала получает блокировку. T1 сначала нужно снять блокировку, затем T2 сможет ее получить); или b происходит до a (в случае, если T2 получает блокировку первым).


Примечание: не все отношения являются полными.

Например, отношение <= Всего по действительным числам. То есть для каждой пары a,b действительных чисел верно либо a<=b, либо b<=a. Общий порядок здесь означает, что, учитывая любые два элемента, мы всегда можем решить, что произойдет первым. данное отношение.

Но отношение P: «является предком», не является полным отношением ко множеству всех людей. Конечно, для некоторых пар людей a,b верно, что либо aPb (a является предком b), либо bPa (b является предком a). Но для большинства из них ни aPb, ни bPa не соответствуют действительности; то есть мы не можем использовать отношение, чтобы решить, какой элемент будет «первым» (в генеалогических терминах).

Возвращаясь к операторам программы, отношение «до и после» R явно является частичным по сравнению с множеством из всех программных операторов (как в примере "предка"): заданные несинхронизированные действия a,b (любые операции, выполняемые разными потоками, в отсутствие правильной синхронизации), ни aRb, ни bRa держит.

...