Я читал учебное руководство Sun на Параллелизме.
Но я не мог понять точно, каковы ошибки непротиворечивости памяти? Я погуглил об этом, но не нашел полезного учебного руководства или статьи об этом.
Я знаю, что этим вопросом является субъективный, таким образом, можно предоставить мне ссылки на статьи о вышеупомянутой теме.
Было бы замечательно, если Вы объясняете это с простым примером.
Вы можете прочитать об опасности чтения после записи (RAW), записи после записи (WAW) и записи после чтения (WAR) чтобы узнать больше по этой теме. Эти опасности относятся к конвейерным процессам, но на самом деле это та же проблема, что и при многопоточности. В основном это означает, что два разных потока обновляют одно и то же место в памяти, и если вы зависите от этих обновлений в определенном порядке, вы можете быть удивлены, увидев, что вы не можете гарантировать порядок, в котором происходят обновления.
Например, если у вас есть два оператора:
x = y + z;
r = x + z;
в одном потоке, у вас нет проблем, потому что значение r всегда будет согласованным. Однако в нескольких потоках может произойти любой из операторов первым, и значение r предсказать труднее.
В основном при отсутствии каких-либо потоков синхронизации можно увидеть другое значение простого поля . Рассмотрим следующий пример:
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 / ).
Это принуждение потоков к повторной проверке памяти называется барьером памяти . Еще один пример барьера памяти - это синхронизированный метод / блок
.
Хм. В основном они говорят о «проблемах видимости» и «проблемах переупорядочения» (эта терминология более распространена, по крайней мере, в Java IMO). Думаю, эта ссылка: http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile объясняет, о чем идет речь в руководстве, используя более общие термины (возможно, Сун пытался использовать «более простой» словарь или что-то в этом роде).
Если вы хотите глубже понять модели согласованности общей памяти, я бы направил вас к следующему учебнику.