Java Thread — ошибки согласованности памяти

Я читал руководство Sun по параллелизму.

Но я не мог точно понять, что такое ошибки непротиворечивости памяти? Я гуглил об этом, но не нашел полезного руководства или статьи об этом.

Я знаю, что этот вопрос субъективен, поэтому вы можете дать мне ссылки на статьи по вышеуказанной теме.

Было бы здорово, если бы вы объяснили это на простом примере.


person Yatendra    schedule 03.05.2010    source источник


Ответы (5)


Вы можете прочитать о чтении после записи (RAW), записи после записи (WAW) и записи после Прочтите (WAR) опасности, чтобы узнать больше об этой теме. Эти опасности относятся к конвейерным процессам, но на самом деле это та же проблема, что и при многопоточности. В основном это означает, что два разных потока обновляют одно и то же место в памяти, и если вы зависите от этих обновлений в определенном порядке, вы можете быть удивлены, увидев, что вы не можете гарантировать порядок, в котором происходят обновления.

Например, если у вас есть два утверждения:

  x = y + z;
  r = x + z;

в одном потоке у вас не будет проблем, потому что значение r всегда будет постоянным. Однако в нескольких потоках возможно, что любой из операторов появится первым, и значение r труднее предсказать.

person Vincent Ramdhanie    schedule 03.05.2010

По сути, при отсутствии какой-либо синхронизации потоки могут видеть другое значение поля simple. Рассмотрим этот пример:

class Foo
{
  int bar = 0;

  void unsafeCall ( )
  {
    final Foo thisObj = this;

    Runnable r = new Runnable ( )
    {
      public void run ( )
      {
        thisObj.bar = 1;
      }
    }

     Thread t = new Thread(r);

     t.start( );
     Thread.sleep( 1000 );

     // May print bar = 0
     System.out.println( "bar = " + bar );
  }
}

Самый простой способ избежать ошибки непротиворечивости памяти — объявить поле bar равным volatile (подробнее см. здесь: https://www.ibm.com/developerworks/java/library/j-jtp06197/).

Это принуждение потоков к повторной проверке памяти называется барьером памяти. Еще одним примером барьера памяти является synchronized метод/блок.

person Alexander Pogrebnyak    schedule 03.05.2010

Хм. В основном они говорят о «проблемах видимости» и «проблемах переупорядочения» (эта терминология более распространена, по крайней мере, в Java IMO). Я думаю, что эта ссылка: http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile объясняет, о чем говорится в руководстве, используя более распространенные термины (возможно, Sun пытался использовать «более простой» словарь или что-то).

person Enno Shioji    schedule 03.05.2010

Я нахожу хороший пример при поиске этого вопроса. Как показано ниже:

    Accesses to main memory might not occur in the same
    order that the CPU initiated them, particularly for writes
    (which often go through hardware write buffers so the CPU
    needn't wait for them). If CPU 1 writes the Answer to
    location A and then writes the AnswerIsReady flag to B,
    CPU 2 may see the change to B before it sees the change
    to A, and thus get the WrongAnswer. Making either or both
    writes atomic doesn't help; what's needed is something
    called a "memory barrier."

через http://www.velocityreviews.com/forums/t390825-memory-consistency-errors.html

person William Bao    schedule 29.02.2012

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

http://rsim.cs.uiuc.edu/~sadve/Publications/computer96.pdf

person reprogrammer    schedule 04.05.2010