Сообщение Re: барьеры памяти, многопоточность от 17.01.2015 22:04
Изменено 17.01.2015 22:21 vsb
Здравствуйте, stuav, Вы писали:
S>Я так понял исходя из статьи что читающие потоки могут получать не консистентное (не последнее) состояние globalMap
Читающие потоки могут получать не просто не последнее состояние, а в общем случае вообще самые причудливые состояния. TreeMap штука не тривиальная и что там может происходить без нормальной синхронизации – даже представить страшно.
Смоделировал вашу ситуацию. Перебор через entrySet часто падает с ConcurrentModificationException. Иногда с NullPointerException. простой get() исключений не кидает, но часто возвращает неверные результаты (не то значение, которое клали по данному ключу).
S>Я так понял исходя из статьи что читающие потоки могут получать не консистентное (не последнее) состояние globalMap
Читающие потоки могут получать не просто не последнее состояние, а в общем случае вообще самые причудливые состояния. TreeMap штука не тривиальная и что там может происходить без нормальной синхронизации – даже представить страшно.
Смоделировал вашу ситуацию. Перебор через entrySet часто падает с ConcurrentModificationException. Иногда с NullPointerException. простой get() исключений не кидает, но часто возвращает неверные результаты (не то значение, которое клали по данному ключу).
Здравствуйте, stuav, Вы писали:
S>Я так понял исходя из статьи что читающие потоки могут получать не консистентное (не последнее) состояние globalMap
Читающие потоки могут получать не просто не последнее состояние, а в общем случае вообще самые причудливые состояния. TreeMap штука не тривиальная и что там может происходить без нормальной синхронизации – даже представить страшно.
Смоделировал вашу ситуацию. Перебор через entrySet часто падает с ConcurrentModificationException. Иногда с NullPointerException. простой get() исключений не кидает, но часто возвращает неверные результаты (не то значение, которое клали по данному ключу). Вот код: http://pastebin.com/P8QtD2R3 можете погонять у себя.
S>Я так понял исходя из статьи что читающие потоки могут получать не консистентное (не последнее) состояние globalMap
Читающие потоки могут получать не просто не последнее состояние, а в общем случае вообще самые причудливые состояния. TreeMap штука не тривиальная и что там может происходить без нормальной синхронизации – даже представить страшно.
Смоделировал вашу ситуацию. Перебор через entrySet часто падает с ConcurrentModificationException. Иногда с NullPointerException. простой get() исключений не кидает, но часто возвращает неверные результаты (не то значение, которое клали по данному ключу). Вот код: http://pastebin.com/P8QtD2R3 можете погонять у себя.