Поток Java - ошибки непротиворечивости Памяти

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

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

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

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

14
задан Yatendra Goel 3 May 2010 в 16:07
поделиться

4 ответа

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

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

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

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

7
ответ дан 1 December 2019 в 14:10
поделиться

В основном при отсутствии каких-либо потоков синхронизации можно увидеть другое значение простого поля . Рассмотрим следующий пример:

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 / ).

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

4
ответ дан 1 December 2019 в 14:10
поделиться

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

3
ответ дан 1 December 2019 в 14:10
поделиться

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

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

0
ответ дан 1 December 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: