"Частичное упорядочение" и "Бывает-до" отношение java

Я читаю следующую книгу

Java-параллелизм на практике http://www.informit.com/store/java-concurrency-in-practice-9780321349606

Меня смущает конкретное объяснение относительно отношения "Бывает до".

Утверждается, что

операции упорядочены путем частичного упорядочения, называемого случаем раньше

Что именно это означает под "частичным упорядочением"?

(В книге есть объяснение, но оно мне не понятно)

2 ответа

Решение

Частичное упорядочение означает, что не каждая пара операций имеет отношение happens-before,

На самом деле тот факт, что не каждая пара операций имеет такое отношение, позволяет вам выполнять операции одновременно.

Например, предположим, что у вас есть операции A, B, C и D.

Мы можем определить частичное упорядочение: A must happen before B and C,

Тогда А и В имеют happens-before отношения, как и A и C. Однако, A и D не имеют этого отношения, поэтому D может выполняться либо до A, после A или во время выполнения A.

Если, с другой стороны, happens-before был полный порядок, такой как A happens-before B happens-before C happens-before D (обратите внимание, что в этом случае для каждой пары операций вы знаете, какая из них происходит - до другой, следовательно, это полный порядок), тогда выполнение операций должно быть последовательным, и параллелизм невозможен.

Поскольку вы имеете в виду книгу "Практический параллелизм Java", я полагаю, что вы находитесь в части о модели памяти Java.

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

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

static Point XY;
…
XY = new Point(3, 4);

другой поток может наблюдать за хранением Point экземпляр в XY поле перед инициализацией x а также y поля этого экземпляра, таким образом, видя (0,0) или (3,0) или (0,4) точку.

Таким образом, нет упорядочения отношений между действиями "назначение XY"," Назначение x"И" назначение yИ чтение этих переменных существует.

Если мы изменим объявление переменной XY к изменчивым отношениям между хранением Point экземпляр в XY и чтение этого экземпляра ссылки установлено. Тем не менее, нет никакого порядка между записями x а также y но теперь обе записи имеют отношение "до и после" к чтению этих двух полей через XY,

Так что это частичный порядок; у некоторых действий есть отношения заказа, у других нет.

Другие вопросы по тегам