энергонезависимый не виден в многопоточности, так же, как поведение кода ниже в Hotspot.
Это не совсем верно. Энергонезависимая запись, без какой-либо дополнительной синхронизации или других отношений «происходит до», не гарантируется для чтения этой же переменной в другом потоке. Это позволило быть видимым, хотя. Я абсолютно видел, как HotSpot делает записи видимыми между потоками, несмотря на то, что ничего не произошло до того. Основываясь на моем опыте с этим, я подозреваю, что если вы удалите этот вызов Thread.sleep
в своем коде, HotSpot также сделает запись в isRunning
видимой для потока, несмотря на отсутствие каких-либо отношений, происходящих перед записью между записью и чтение.
Вы определенно правы, что это VM-специфицировано c, и, возможно, даже вероятно процессорная спецификация c, так как разные архитектуры могут давать разное количество синхронизации для "бесплатно" или иметь разные объемы кеша, которые влияют на то, будет ли адрес памяти считываться из кеша ядра или извлекаться из основной памяти.
Таким образом, вы никогда не должны полагаться на такое поведение, работающее любым конкретным c способом. на любой указанной c ВМ - она может быть изменена без предупреждения.