Информация об изменениях

Сообщение Re: барьеры памяти, многопоточность от 17.01.2015 22:04

Изменено 17.01.2015 22:24 vsb

Здравствуйте, stuav, Вы писали:

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


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

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

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


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

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

Лучше сделать как положено.