почитал я тут статью
http://habrahabr.ru/company/golovachcourses/blog/221133/
хотелось бы понять:
1. есть некая глобальная TreeMap globalMap;
2. есть у меня группа потоков (группа1) она пишет в эту globalMap, кусок который пишет оформлен в виде synchronized(globalMap){что-то...}
3. есть группа потом которая только читает (группа2) она не синхронизируется через globalMap т.к. синхронизация происходит отдельно посредством бизнес логики, серия записей происходит в отдельные специальные моменты времени а так в основном только чтение.
Я так понял исходя из статьи что читающие потоки могут получать не консистентное (не последнее) состояние globalMap
что делать то? если нет общего синхронизирующего обьекта?
Здравствуйте, stuav, Вы писали:
S>что делать то? если нет общего синхронизирующего обьекта?
Кусать локти
На самом деле, подходов много.
1) Ввести этот самый "общий синхронизирующий объект".
2) Использовать ReadWriteLock.
3) Использовать copy-on-write подход. В этом случае при каждом изменении вы копируете всю мапу, находясь внутри synchroninzed. А читатели работают всегда с гарантированно неизменяемой копией, им нужен только volatile доступ к ней, без всяких синхорнизаций.
4) Использовать готовые решения. Например, ConcurrentHashMap, SnapTreeMap, и т.д..
Здравствуйте, stuav, Вы писали:
S>Я так понял исходя из статьи что читающие потоки могут получать не консистентное (не последнее) состояние globalMap
Читающие потоки могут получать не просто не последнее состояние, а в общем случае вообще самые причудливые состояния. TreeMap штука не тривиальная и что там может происходить без нормальной синхронизации – даже представить страшно.
Смоделировал вашу ситуацию. Перебор через entrySet часто падает с ConcurrentModificationException. Иногда с NullPointerException. простой get() исключений не кидает, но часто возвращает неверные результаты (не то значение, которое клали по данному ключу). Вот код:
http://pastebin.com/P8QtD2R3 можете погонять у себя. Это, конечно, не совсем ваша ситуация, тут никакой синхронизации нет вообще. Но скорее всего у вас есть все шансы достать неверное значение в полнолуние.
Лучше сделать как положено.