Предполагая следующий код:
class X {
private int v = 1;
public void set(int v) { this.v = v; }
public int get() { return v; }
}
существует ли вероятность того, что, не пометив v
как энергозависимый, при вызове set(123)
его значение не будет распространяться на другие ядра (то есть ихкэширования и / или основной памяти), или это просто вопрос времени, пока это не произойдет?
Обсуждая вопрос, общая идея, как представляется, заключается в том, что рано или поздно значение «попадет туда», поэтомудо тех пор, пока нам не нужно слишком много времени, можно оставить значение неизменным, но я хотел быть формально уверенным.
Насколько я понимаю, семантика получения / выпуска отсутствует,JMM не гарантирует, что это сработает, но, с другой стороны, мое (ограниченное) понимание моделей когерентности / согласованности кэша (а именно TSO-x86) заключается в том, что он обязательно будет в конечном итоге распространяться (пометив его как volatile, просто поместитзабор, чтобы запретить переупорядочения в буфере хранения ЦП, но кроме этого он в конечном итоге будет распространен на другие кэши).В связи с этим есть только один момент, который заставляет меня задуматься - что произойдет, если другое ядро записывает что-то в другую переменную в той же строке кэша?Может ли он в любом случае перезаписать v
?
Может ли кто-нибудь, знающий в этих вопросах, дать мне более конкретный ответ?
Спасибо!