Скажем, у меня есть параллельная карта с коллекциями как ценность:
Map<Integer, List<Integer> map = new ConcurrentHashMap<>();
map.putIfAbsent(8, new ArrayList<>());
и я обновляю значение следующим образом:
map.computeIfPresent(8, (i, c) -> {
c.add(5);
return c;
});
Я знаю, что computeIfPresent
вызов всего метода выполняется атомарно. Однако, учитывая, что к этой карте одновременно обращаются несколько потоков, я немного обеспокоен видимостью данных об изменениях, сделанных для базовой коллекции. В этом случае значение 5 будет отображаться в списке после вызова map.get
Мой вопрос будет изменен на список, который будет отображаться в других потоках при вызове map.get
если изменения выполняются в computeIfPresent
метода computeIfPresent
.
Обратите внимание, что я знаю, что изменения в списке не будут видны, если я буду ссылаться на список перед выполнением операции обновления. Я не уверен, что изменения в списке будут видны, если я буду ссылаться на список (вызывая map.get
) после операции обновления.
Я не уверен, как интерпретировать документы, но мне кажется, что это происходит - прежде чем отношения гарантируют видимость изменений в базовой коллекции в этом конкретном случае
Более формально операция обновления для заданного ключа несет связь между событиями перед любым (ненулевым) извлечением для этого ключа, сообщающего обновленное значение