Предположим, у меня есть следующее:
char[] shared = new char[]{'a', 'b'};
ExecutorService exec = Executors.newCachedThreadPool();
Future<?> f1 = exec.submit(() -> shared[0] = 'A');
Future<?> f2 = exec.submit(() -> shared[1] = 'B');
f1.get(); f2.get();
System.out.println(shared);
Я ожидаю, что это будет обычно печатать:
'AB'
Но возможно ли это для печати:
'aB'
или
'bA'
Интересно, если shared
не является энергозависимым, один поток может, сохраняя свои изменения в соответствующем элементе char, сохранить соседние байты, которыеустареть в своем локальном кеше процессора и растоптать изменения, сделанные другим потоком.У меня есть чувство, что ответ «нет», потому что я думаю, что это нарушило бы модель памяти Java, которая гласит, что всякий раз, когда поток присоединяется, все действия, которые он выполняет, выполняются до соединения.Но если это так, то мне интересно, как это предотвратить?Насколько я понимаю, когда байты сбрасываются, вся строка кэша сбрасывается, и я предполагаю, что массив char [] будет иметь несколько элементов, расположенных в одной строке кэша.