Задать вопрос
@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 ребро
  • Вопрос задан
  • 280 просмотров
Подписаться 3 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Java-разработчик с нуля
    12 месяцев
    Далее
  • Skillfactory
    Профессия Java-разработчик
    14 месяцев
    Далее
  • Яндекс Практикум
    Java-разработчик
    10 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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