Достаточно ли изменчива для изменения ссылки на список?
Допустим, у нас есть ссылка на список:
volatile List<Object> a;
Теперь поток 1 инициализирует его:
List<Object> newA = new LinkedList<>();
newA.add(new String("a"));
a = newA; // Write to a volatile (equivalent to exiting a synchronized block in terms of memory barriers)
тогда поток 2 делает:
Object o = a.get(0); // Compound operation - first we read a volatile reference value, then invoke .get() method on it. Read to a volatile is equivalent to entering a synchronized block.
Гарантируется ли "o" ссылка на строку, добавленную потоком 1? Или я что-то упустил? Предполагая, что код из потока 1 выполняется перед кодом из потока 2.
2 ответа
Решение
Гарантируется ли "o" ссылка на строку, добавленную потоком 1?
Если вы можете гарантировать, что никакие другие действия между потоками, кроме тех, которые вы явно упомянули, никогда не будут применены к вашему списку, тогда да, у вас есть гарантия, о которой вы спрашиваете.
Если какой-либо поток изменяет список после того, как он был опубликован через volatile
переменная, то никакие межпотоковые гарантии больше не сохраняются.
ДА, если Thread1 выполняется перед Thread2, то он предоставит гарантию.