Вопросы про видимость

 
 
 
Сообщения:15
Изучаю многопоточность, появилось сразу несколько схожих вопросов

1) Обеспечивает atomic также и эффект volatile ?
т.е. могут ли быть проблемы с видимостью ?

2) Обеспечивают Concurrent коллекции эффект volatile ?
аналогичный предыдущему вопрос.
если я кладу объект в ConcurrentHashMap, будет ли он всегда виден всем потокам сразу же ?

3) как насчет synchronized ?
допустим, вместо ConcurrentHashMap, я использую обычный HashMap + synchronized
как обеспечить видимость для всех потоков ?
 
 
Сообщения:10026
Видимость - это минимальное требование. Все перечисленные конструкции обеспечивают видимость.
 
 
Сообщения:15
Староверъ:
Видимость - это минимальное требование. Все перечисленные конструкции обеспечивают видимость.


как это делает synchronized ?

HashMap<String, String> hm = new HashMap<>();
// ...
// где-то в другом месте
synchronized(hm) {
  hm.put("test", "test");
}


после окончания блока synchronized все потоки гарантированно увидят вставленное значение ?
 
 
Сообщения:15
Староверъ:
Видимость - это минимальное требование. Все перечисленные конструкции обеспечивают видимость.


кстати, еще, зачем тогда нужен volatile, если выходит всегда можно использовать atomic ?
 
 
Сообщения:10026
spin:
после окончания блока synchronized все потоки гарантированно увидят вставленное значение ?
Если обратятся к этому объекту через все тот же synchronized(hm), то да. Т.е. обоим потокам нужно наткнуться на инструкцию синхронизации. Как и в случае с volatile - обоим потокам нужно наткнутся на volatile переменную.
spin:
кстати, еще, зачем тогда нужен volatile, если выходит всегда можно использовать atomic ?
Atomic дает больше - он позволяет сравнить и изменить значение атомарно (в зависимости от архитектуры процессора это может быть команда CAS - compare and swap). volatile не дает такой возможности. Т.е. Atomic - это обертка над volatile которая дает доп возможности. Собсно если ты глянешь внутрь AtomicInteger на методы get()/set() - они просто читают/записывают volatile переменную.
 
 
Сообщения:15
Староверъ:
Atomic дает больше - он позволяет сравнить и изменить значение атомарно (в зависимости от архитектуры процессора это может быть команда CAS - compare and swap). volatile не дает такой возможности. Т.е. Atomic - это обертка над volatile которая дает доп возможности. Собсно если ты глянешь внутрь AtomicInteger на методы get()/set() - они просто читают/записывают volatile переменную.


я понимаю что atomic дает больше
значит выходит volatile не нужен?
 
 
Сообщения:10026
Как правило если есть выбор мы стараемся использовать объекты с минимально необходимым функционалом. Чтоб когда мы смотрели на переменную мы понимали какая работа с ней предполагается даже не видя остальной код. В этом смысле volatile лучше Atomic'ов если не предполагается использование CAS операций. Хотя Atomic не настолько уж больше позволяет, никто не умрет если ты его вместо volatile заиспользуешь.
Изменен:01 дек 2020 10:22
 
 
Сообщения:15
Староверъ:
Как правило если есть выбор мы стараемся использовать объекты с минимально необходимым функционалом. Чтоб когда мы смотрели на переменную мы понимали какая работа с ней предполагается даже не видя остальной код. В этом смысле volatile лучше Atomic'ов если не предполагается использование CAS операций. Хотя Atomic не настолько уж больше позволяет, никто не умрет если ты его вместо volatile заиспользуешь.


ок, понятно
спасибо
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет