|
|
|
Что будет если использовать HashMap в многопоточной среде?
|
|||
|---|---|---|---|
|
#18+
questionerВсе знают, что в многопоточной среде нужно использовать синхронизованные коллекции. Меня тут спросили, а что будет если использовать обычную хеш мапу? ConcurrentModificationException ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2017, 17:40 |
|
||
|
Что будет если использовать HashMap в многопоточной среде?
|
|||
|---|---|---|---|
|
#18+
questionerвот что за первая итерация у них нарисована? и чем thread1 buckets отличается от thread2 buckets? Тут и тут примерно все разобрано. Пока идет чтение переменных по reference или вызов функций возвращаюших значение в одном потоке, другой поток может изменить значения по reference внутри массива или на сам массив (добавить элемент в массив или скопировать массив), в результате у каждого потока может указатель на различные массивы или переменные в массиве (один поток добавил ключ а другой этот элемент не увидел и продублировал операцию либо увеличил массив при переполнении длины) - учтите такой фактор как синхронизация и видимость данных между потоками - когда HashMap не volatile, возникают дополнительные комбинации для race condition так как сложно сказать когда изменения сделанные в одном потоке будет видны в другом. Даже при работе в многопоточном режиме только на чтение из hashmap желательно учитывать когда создаются потоки и когда заканчивает заполняеться hashmap. The answer is yes, there are potential race conditions: when resizing an HashMap by two threads at the same time when collisions happens. Collision can happen when two elements map to the same cell even if they have a different hashcode. During the conflict resolution, there can be a race condition and one added key/value pair could be overwritten by another pair inserted by another thread. To explain better what I mean on the second point, I was looking at the source code of HashMap in OpenJdk 7 Код: java 1. 2. First it calculates an Hash of your key (combining two hash functions), then it maps to a cell with indexFor, then it checks if that cell contains the same key or is already occupied by another one. If it's the same key, it just overwrite the value and there is no problem here. If it's occupied it looks at the next cell and then the next until it finds an empty position and call addEntry(), which could even decide to resize the array if the array is more loaded than a certain loadFactor. Our table containing the entries is just a vector of Entry which holds key and value. Код: java 1. 2. 3. 4. In a concurrent environment, all sort of evil things can happen, for instance one thread gets a collision for cell number 5 and looks for the next cell (6) and finds it empty. Meanwhile another thread gets an index of 6 as a result of indexFor and both decide to use that cell at the same time, one of the two overwriting the other. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2017, 23:33 |
|
||
|
Что будет если использовать HashMap в многопоточной среде?
|
|||
|---|---|---|---|
|
#18+
UsmanquestionerВсе знают, что в многопоточной среде нужно использовать синхронизованные коллекции. Меня тут спросили, а что будет если использовать обычную хеш мапу? ConcurrentModificationException Один из возможных вариантов, но только при итерации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2017, 00:17 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39388624&tid=2123240]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
8ms |
get forum data: |
1ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 189ms |
| total: | 307ms |

| 0 / 0 |
