барьеры памяти, многопоточность
От: stuav  
Дата: 16.01.15 23:53
Оценка:
почитал я тут статью
http://habrahabr.ru/company/golovachcourses/blog/221133/

хотелось бы понять:
1. есть некая глобальная TreeMap globalMap;
2. есть у меня группа потоков (группа1) она пишет в эту globalMap, кусок который пишет оформлен в виде synchronized(globalMap){что-то...}
3. есть группа потом которая только читает (группа2) она не синхронизируется через globalMap т.к. синхронизация происходит отдельно посредством бизнес логики, серия записей происходит в отдельные специальные моменты времени а так в основном только чтение.

Я так понял исходя из статьи что читающие потоки могут получать не консистентное (не последнее) состояние globalMap

что делать то? если нет общего синхронизирующего обьекта?
Re: барьеры памяти, многопоточность
От: Cyberax Марс  
Дата: 17.01.15 00:17
Оценка:
Здравствуйте, stuav, Вы писали:

S>Я так понял исходя из статьи что читающие потоки могут получать не консистентное (не последнее) состояние globalMap

S>что делать то? если нет общего синхронизирующего обьекта?
Очень просто — не делать так. Или использовать синхронизацию, или взять реализацию неблокирующей карты. Без специального опыта вы её сами не напишете.
Sapienti sat!
Re: барьеры памяти, многопоточность
От: devcoach  
Дата: 17.01.15 20:52
Оценка: +2
Здравствуйте, stuav, Вы писали:

S>что делать то? если нет общего синхронизирующего обьекта?

Кусать локти
На самом деле, подходов много.
1) Ввести этот самый "общий синхронизирующий объект".
2) Использовать ReadWriteLock.
3) Использовать copy-on-write подход. В этом случае при каждом изменении вы копируете всю мапу, находясь внутри synchroninzed. А читатели работают всегда с гарантированно неизменяемой копией, им нужен только volatile доступ к ней, без всяких синхорнизаций.
4) Использовать готовые решения. Например, ConcurrentHashMap, SnapTreeMap, и т.д..
Re: барьеры памяти, многопоточность
От: vsb Казахстан  
Дата: 17.01.15 22:04
Оценка:
Здравствуйте, stuav, Вы писали:

S>Я так понял исходя из статьи что читающие потоки могут получать не консистентное (не последнее) состояние globalMap


Читающие потоки могут получать не просто не последнее состояние, а в общем случае вообще самые причудливые состояния. TreeMap штука не тривиальная и что там может происходить без нормальной синхронизации – даже представить страшно.

Смоделировал вашу ситуацию. Перебор через entrySet часто падает с ConcurrentModificationException. Иногда с NullPointerException. простой get() исключений не кидает, но часто возвращает неверные результаты (не то значение, которое клали по данному ключу). Вот код: http://pastebin.com/P8QtD2R3 можете погонять у себя. Это, конечно, не совсем ваша ситуация, тут никакой синхронизации нет вообще. Но скорее всего у вас есть все шансы достать неверное значение в полнолуние.

Лучше сделать как положено.
Отредактировано 17.01.2015 22:24 vsb . Предыдущая версия . Еще …
Отредактировано 17.01.2015 22:21 vsb . Предыдущая версия .
Отредактировано 17.01.2015 22:19 vsb . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.