@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 просмотров
Пригласить эксперта
Ответы на вопрос 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
22 нояб. 2024, в 22:26
3500 руб./за проект
22 нояб. 2024, в 21:47
3000 руб./за проект
22 нояб. 2024, в 21:44
50000 руб./за проект