|
|
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
Сразу оговорюсь, что знаю: ConcurrentModificationException и многопоточность связаны мало. Был такой вопрос на собеседовании (не я был, поэтому у спрашивающего и не спросил, а тут пишу). В одном потоке добавляем в ArrayList элементы, в другом - ходим итератором поэтому же списку. Что будет? В общем интервьювер хотел услышать ответ ConcurrentModificationException. Собственно он его и получил. А я собственно, услышав эту историю, подумал, что а с какого фига будет обязательно ConcurrentModificationException. Когда он вылетает? когда итератор видит, что его запомненное(при вызове метода iterator на листе) число модификаций и число модификаций на момент итерирования на листе не совпадают. Ведь не факт, что эта переменная volatile - смотрю в код, а она и действительно не volatile. Я что-то упустил и интервьювер прав или всё-таки мои рассуждения верны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 00:07 |
|
||
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
100% корректным ответом будет: "поведение не определено". То есть будет что-то, но хз, что именно. Может быть все отработает нормально. Может быть свалится ConcurrentModificationException, а может быть вы вообще получите черт знает что. Это следует из того, что, как вы правильно заметили, в ArrayList нету никакой синхронизации. А потому нет никаких гарантий, что один поток будет видеть происходящие параллельно изменения из другого потока. Но все же, в 99,9% случае будет банальный ConcurrentModificationException. Воспринимайте его как попытку разработчиков JVM пусть и не гарантированно, но все же с достаточно высокой вероятностью, предупредить вас о неправильном использовании ArrayList. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 00:13 |
|
||
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
cdtyjv, Ну "поведение не определено" - это скоре к C++, в джаве достаточно строгая модель памяти. Запись в несинхронизированные поля атомарна (кроме лонгов - они могут писаться по 32 бита), а видимость определяется по happens-before. Остальное - чистая правда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 00:50 |
|
||
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
scfcdtyjv, Ну "поведение не определено" - это скоре к C++, в джаве достаточно строгая модель памяти. Запись в несинхронизированные поля атомарна (кроме лонгов - они могут писаться по 32 бита), а видимость определяется по happens-before. Остальное - чистая правда.Ну в том то и дело, что видимость между потоками в ArrayList нет, так как в нем нету примитивов синхронизации => нету happens-before. Недавно читал забавный древний баг-репорт когда HashMap сваливалась в бесконечный цикл при ее конкурентной модификации и сериализации. Это и есть то, что я называю "поведение неопределенно". И неопределенность эта может быть вызвана, как проблемами видимости, так и банальными race condition. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 00:59 |
|
||
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
scfНу "поведение не определено" - это скоре к C++, в джаве достаточно строгая модель памяти. Запись в несинхронизированные поля атомарна (кроме лонгов - они могут писаться по 32 бита), а видимость определяется по happens-before. Остальное - чистая правда. Что за бред. Для не синхронизированых структур поведение при многопоточной записи\чтении не предсказуемо. При чем здесь модель памяти??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 09:06 |
|
||
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
scfВот вам познавательная статья: http://habrahabr.ru/company/golovachcourses/blog/221133/ Не нужно грубить мне в пятницу. Иван, конечно, молодец. Но материалы делает целенаправленно для начинающих. Если вы не понимаете то что написано в статье, то ваше тыкание в неё выглдятит вот так: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 09:34 |
|
||
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, По вашему "причем здесь модель памяти?" я решил, что вы незнакомы с этой концепцией, вот и выбрал материал для начинающих. Вопрос действительно звучит странно, т.к. гарантии, которые дает java при многопоточном исполнении кода, описаны именно в этом документе. К тому же, выражение "что за бред" - это фирменное выражение DBA, откуда им знать про JMM :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 10:02 |
|
||
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
scfПо вашему "причем здесь модель памяти?" я решил, что вы незнакомы с этой концепцией, вот и выбрал материал для начинающих. Вопрос действительно звучит странно, т.к. гарантии, которые дает java при многопоточном исполнении кода, описаны именно в этом документе. Ну, то есть вы знаете при чем здесь модель памяти. Но пояснить не можете? scfК тому же, выражение "что за бред" - это фирменное выражение DBA, откуда им знать про JMM :-) Ок. Вопросов больше не имею. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 10:05 |
|
||
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
Могу повторить, что UD (undefined behaviour) - это термин из стандарта С++, где компилятор *действительно* может делать что угодно. Java - это скорее "unspecified behaviour", т.к. при при работе с несинхронизированными данными вполне можно предсказать все возможные исходы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 10:06 |
|
||
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Стало интересно, посмотрел ваши другие посты. Вроде адекватный, опытный человек. Разверните тогда свою мысль про бред? Насколько я помню, JMM гарантирует атомарность обновления большей части полей (кажись, кроме только лонга), поэтому при многопоточном исполнении без синхронизации неопределенным будет только порядок операций и видимость их результатов. Что на undefined behaviour не тянет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 10:17 |
|
||
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
scfнеопределенным будет только порядок операций и видимость их результатов "Поведение" это и есть операции и порядок их выполнения. scfЧто на undefined behaviour не тянет. Вы взяли фразу. Решили что она является термином. И спорите с тем что этот термин применим к Java. "поведение не определено", это ответ на вопрос "Что будет?". Вполне точный. Если вам не нравится, фраза и вы знаете точный и правильный термин, то и ссылку надо приводить на ваш термин и его определение. Например, вышеуказаный http://en.wikipedia.org/wiki/Unspecified_behavior Тоже никакого отношения к вопросу не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 10:29 |
|
||
|
ConcurrentModificationException.
|
|||
|---|---|---|---|
|
#18+
scf , Слушайте, вы приводите сслыки на статьи по JMM, а сами же ее и не понимаете. Зачем, по-вашему, нужно ключевое слово volatile, если на 64-битной платформе все записи и чтения, включая long и double, итак уже атомарны? А затем, что у Java нет строгой модели памяти, а следовательно не гарантирована видимость чтений и записей. Если вы записали в переменную сначала 1, потом 2, а потом 3, то другой поток может вернуть вам любое из этих значений в отсутствие синхронизации. Модель памяти это допускает. Из-за этого и возникает непредсказуемое поведение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2014, 10:38 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38738179&tid=2126640]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
217ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 239ms |
| total: | 555ms |

| 0 / 0 |
