Несколько потоков, читающих переменную - PullRequest
2 голосов
/ 01 декабря 2011

Я читаю "Effective Java Second Edition" Джошуа Блоха, и меня смущает приведенное ниже утверждение относительно параллелизма -

"Спецификация языка гарантирует, что чтение или запись переменной является атомарной, если переменная нетипа long или double [JLS, 14.4.7]. Другими словами, чтение переменной, отличной от long или double, гарантированно возвращает значение, которое было сохранено в этой переменной каким-либо потоком, даже если несколько потоков изменяют переменную одновременнои без синхронизации. "

Это указано в последнем абзаце страницы 259 на случай, если у кого-нибудь есть книга под рукой.

Будет ли указанная переменная не всегда иметь значение, даже если несколько потоков изменяютсяэто?

Ответы [ 3 ]

3 голосов
/ 01 декабря 2011

Вы должны прочитать предложение в целом. Вот, позвольте мне перефразировать это для вас:

"Другими словами, чтение переменной, отличной от long или double, гарантирует получение значения, которое было сохранено в этой переменной некоторым потоком, даже если несколько потоков изменяют переменную одновременно и без синхронизации"

становится:

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

Это значение всегда будет одним из значений, записанных одним из потоков. Вы не сможете заранее определить, какой из них, но это всегда будет ценность, которую написал один из них. Это никогда не будет коррумпированной половинкой стоимости. "

1 голос
/ 01 декабря 2011

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

Причина этого в том, что они имеют длину 8 байт, а не 4 байта , поэтому вы можете прочитать половинунового значения переменной и другой половины старого значения (может быть, не совсем так просто в зависимости от конкретной архитектуры, но это идея), приводят к неправильному чтению, которое было НИКОГДА записано в него.

0 голосов
/ 01 декабря 2011

Он говорит, что переменная будет иметь значение, но это значение недетерминировано (из-за действий ваших параллельных потоков над переменной).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...