Ответ 1
Чтения и записи являются атомарными для ссылочных переменных.
Источник: http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html
Простой вопрос: записывает ли память Java/синхронизация модельный атомный указатель? То есть, если у нас есть конкурирующие потоки:
String shared;
thread1()
{
shared = "a";
}
thread2()
{
shared = "hello world";
}
всегда shared
всегда null
, "a"
или "hello world"
?
Чтения и записи являются атомарными для ссылочных переменных.
Источник: http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html
Это атомный.
Однако в приведенном примере значение shared
не обязательно один null
, a
или hello world
. Возможно, что без правильной синхронизации каждый поток никогда не увидит значение, заданное другими потоками. Итак, thread 1
увидит a
, а thread 2
будет видеть hello world
одновременно.
Изменить: Добавлены ссылки для последнего абзаца для дальнейшего чтения
JLS объясняет порядок работы, выполняемый разными потоками, в Глава 17 - Темы и блокировки. В частности, в разделе 17.4.5 Happens-before Order. Кроме того, хорошо написанная Java Concurrency на практике полностью объясняет это.
Да. Из раздел 17.7 JLS:
Записи и чтения ссылок всегда являются атомарными, независимо от того, реализованы ли они как 32-разрядные или 64-битные значения.
(Это не значит, что вы всегда увидите "последнее" значение, но это другое дело.)
Это будет одно из этих трех значений, да - но это undefined. Последний в "победах".
Вы не спрашивали, но для полноты - это НЕ будет "hello wor" или какой-то частичной версией этой строки.