Проблема Видимости в Java вызвана JVM или Аппаратным обеспечением? - PullRequest
0 голосов
/ 18 августа 2011

Ранее я думаю, что проблема с видимостью связана с кэш-памятью процессора для повышения производительности.

Но я видел эту статью: http://www.ibm.com/developerworks/java/library/j-5things15/index.html

В параграфе 3. Изменчивые переменные сообщают, что Thread содержит кеш, похоже, что кеш вызван JVM.

Какой ответ? JVM или аппаратное обеспечение?

1 Ответ

0 голосов
/ 21 января 2012

JVM дает вам слабые гарантии. Компилятор и оборудование вызывают у вас проблемы. : -)

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

Большинство программистов знакомы с тем фактом, что ввод синхронизированного блока означает получение блокировки на мониторе, которая гарантирует, что никакой другой поток не сможет войти в синхронизированный блок. Менее знакомы, но не менее важны факты, которые

(1) При получении блокировки и вводе синхронизированного блока поток обновляет данные из памяти. (2) После выхода из синхронизированного блока записанные данные записываются в память. http://www.javacodegeeks.com/2011/02/java-memory-model-quick-overview-and.html

См. Также JSR 133 (модель памяти Java и редакция спецификации потока) http://jcp.org/en/jsr/detail?id=133 Выпущено с JDK 1.5.

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