Задать вопрос
@bakomchik

Будет ли ArrayList прочитан в консистентном состоянии в j.u.c.ConcurrentHashMap?

имею код:
private final Map<Long, SomeStuff> map = new ConcurrentHashMap<>();

//Called by Thread 1
public void write() {
   List list = new ArrayList<>();
   for (int i = 0; i <100 ; i++) {
     list.add(new Stuff(i))
   }
   map.put(1L,list)
}
// Called by Thread 2
public void read() {
    List list = map.get(1L);  // Будет ли лист в консистентном состоянии(кол-во элементов) , будут ли все элементы коллекции безопасно опубликованы 
}


Вернет ли map.get(1L) лист в консистентном состоянии(кол-во элементов) , будут ли все элементы коллекции безопасно опубликованы ?
Я спрашиваю, тк в сорсах j.u.c.ConcurrentHashMap put синхронизирован на Node в которую пишет значение
А get идет через Unafe.getObjectVolatile
и я никак не разберу , есть ли между ними HB ребро
  • Вопрос задан
  • 279 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Да. Это гарантируется интерфейсом ConcurrentMap.

Memory consistency effects: As with other concurrent collections, actions in a thread prior to placing an object into a ConcurrentMap as a key or value happen-before actions subsequent to the access or removal of that object from the ConcurrentMap in another thread.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы