2013-08-29 3 views
4

Я заметил, что небезопасная публикация объектов в JVM 1.5+ вряд ли вызовет какие-либо проблемы, независимо от спецификаций JVM, заявив, что не гарантировано, что такие объекты будут видны между потоками.Являются ли архитектуры x86/x64 устойчивыми к небезопасной публикации?

Глядя вокруг в Интернете я нашел это: http://forum.springsource.org/archive/index.php/t-60676.html Человек с ником «AL0» утверждает, что «[...] это очень маловероятно, чтобы встретить такое поведение на x86/x64 на основе машин, но на Компьютеры HP PA-RISC или IBM Power ... (например, AS400) гораздо более вероятны ».

Являются ли архитектуры x86/x64 устойчивыми к небезопасной публикации? Как так?

+2

x86/x64 имеет относительно сильные гарантии порядка памяти, хотя я не думаю, что на самом деле это гарантирует, что небезопасная публикация небезопасна. AFAIK, это скорее «он, вероятно, работает в любом случае». – harold

ответ

3

Процессоры x86 несколько устойчивы к небезопасной публикации. В частности, до тех пор, пока один поток записывает только в общую память, а другой только считывает, процессор обрабатывает все нагрузки и магазины, как если бы в ячейках памяти была Java volatile семантика. Пишу никогда не заказаны пишет прошлое, и читает никогда не заказаны прошлое читает, так что чтение нить всегда видит пишет в правильном порядке

Однако:

  • запись может быть перемещена после чтения, который приходит позже программа. В этом смысле volatile по-прежнему сильнее, чем то, что обещает x86

  • Это касается только того, что процессор может сделать с вашим кодом. Виртуальная машина может по-прежнему изменять порядок кода по своему усмотрению. Например, он может переписать x.b = 4; y.a = 5; в y.a = 4; x.b = 5.

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

1

Я не хочу предполагать, будет ли проблема более или менее вероятной на процессорах x86/x64. Утверждение, что это очень маловероятно, чтобы увидеть это поведение на процессорах x86/x64, является неправильным.

Niklas Schlimm написал статью об этом в DZone с рабочим примером, чтобы продемонстрировать неправильное поведение, если переменная с многопоточным доступом не объявлена ​​изменчивой. Он пишет в статье, что он может воспроизводить поведение только с VM-сервера, но для меня тест также не работает с клиентской виртуальной машиной (Oracle Java 7, Intel x64 Mobile CPU). Важно помнить, что это зависит, по крайней мере, от точной версии Java VM и модели CPU, если поведение воспроизводится вообще или, возможно, даже спорадически.