Понимание JVM происходит до и переупорядочить - PullRequest
3 голосов
/ 09 июля 2011

Я читаю спецификацию JLS для модели памяти, 17.4.5. Произошло до заказа . Я не понимаю первое правило:

"# Если x и y являются действиями одного и того же потока, а x предшествует y в программе порядок, то hb (x, y). "

Давайте предположим, что A и B являются объектами (экземплярами объекта класса), которые могут быть разделены между несколькими потоками:

int i=A.getNum();  // ActionA
int j=B.getNum();  // ActionB

Три вопроса:

  1. Согласно приведенному выше правилу, означает ли это hb (ActionA, ActionB) ?

  2. Если ответ на 1 верен, означает ли это, что в соответствии с правилом «до того, как это произошло», ActionB не может быть переупорядочен для перехода к ActionA в любой JVM, которая следует модели памяти JSR133?

  3. Если 1 и 2 оба истинны, кажется, что ActionA и ActionB не имеют отношения, почему нельзя изменить их порядок? только для этой спецификации?

Ответы [ 3 ]

9 голосов
/ 09 июля 2011

Насколько я понимаю, что:

  1. вы правы
  2. они могут быть переупорядочены, но только если действие B не зависит от результата действия A

Отношения «до и после» ничего не говорят о переупорядочении действий.Это только говорит о том, что если HB (A, B) выполняется, то действие B должно видеть эффекты памяти действия A.

Если действие B не использует какой-либо результат действия A, то нет никаких причин, почему онине может быть переупорядочено.(Как правило, «использовать любой результат другого действия» довольно широко, и его можно обнаружить только для довольно простых действий, таких как чтение / запись в память, а не для действий, использующих внешние ресурсы, такие как операции ввода-вывода или операции на основе времени)

3 голосов
/ 09 июля 2011

Да, действие А происходит до действия В. Читайте дальше в этом разделе, хотя. Это не обязательно означает, что JVM не может изменить их порядок. Это означает, что ActionB должен наблюдать эффект ActionA, вот и все. Если ActionB никогда не зависит от эффекта ActionA, это тривиально верно.

2 голосов
/ 09 июля 2011

Вы в основном правы в своем понимании.Однако следует помнить следующее:

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

Это последний факт, который является общим источникомошибок и недоумения в многопоточном программировании в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...