Является ли Java-указатель атомарным? - программирование
Подтвердить что ты не робот

Является ли Java-указатель атомарным?

Простой вопрос: записывает ли память Java/синхронизация модельный атомный указатель? То есть, если у нас есть конкурирующие потоки:

String shared;

thread1()
{
    shared = "a";
}

thread2()
{
    shared = "hello world";
}

всегда shared всегда null, "a" или "hello world"?

4b9b3361

Ответ 2

Это атомный.

Однако в приведенном примере значение shared не обязательно один null, a или hello world. Возможно, что без правильной синхронизации каждый поток никогда не увидит значение, заданное другими потоками. Итак, thread 1 увидит a, а thread 2 будет видеть hello world одновременно.

Изменить: Добавлены ссылки для последнего абзаца для дальнейшего чтения

JLS объясняет порядок работы, выполняемый разными потоками, в Глава 17 - Темы и блокировки. В частности, в разделе 17.4.5 Happens-before Order. Кроме того, хорошо написанная Java Concurrency на практике полностью объясняет это.

Ответ 3

Да. Из раздел 17.7 JLS:

Записи и чтения ссылок всегда являются атомарными, независимо от того, реализованы ли они как 32-разрядные или 64-битные значения.

(Это не значит, что вы всегда увидите "последнее" значение, но это другое дело.)

Ответ 4

Это будет одно из этих трех значений, да - но это undefined. Последний в "победах".

Вы не спрашивали, но для полноты - это НЕ будет "hello wor" или какой-то частичной версией этой строки.