2013-05-12 5 views
1

согласно Java DocsВыполнение операции ConcurrentHashMap не блокируется?

операции Retrieval (включая ГЭТ), как правило, не блокируют, поэтому могут перекрываться с обновлением операций (в том числе на месте и удалить). Retrievals отражают результаты последних завершенных операций по обновлению с их началом. Для агрегатные операции, такие как putAll и ясно, одновременно извлечений может отражать вставку или удаление только некоторых записей

вопрос: Предположим, что поток t1 обновляет пару ключ-значение (так называемый х), а затем другой поток t2 приходит и хочет прочитать х, будет ли копия c1 создана х в начале t2 и t2 будет читать из этой копии c1

ответ

1

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

здесь важное слово. Теперь ваш сценарий

Suppose a thread t1 is updating a key-value pair(called x), and then other thread t2 comes and want to read x. 

T2 будет считывать значение обновляется с помощью операции, которая была завершена не под process.In ваш сценарий, если операция обновления с помощью резьбы t1 не завершена, t2 не будет видеть обновленное значение. Копия не создается. Его простой временной фонд. Если к тому моменту, когда поток t2 прочитал операцию x, и операция обновления t2 будет завершена, в противном случае оно увидит обновленное значение.

+0

'иначе нет.' - откуда будет видеть t2, поскольку старое значение больше не существует (оно находится в процессе обновления), когда t2 прибыл, чтобы читать –

1

вопрос: Предположим, что поток t1 обновляет пару ключ-значение (так называемый х), а затем другой поток t2 приходит и хочет читать х, будет ли копия c1 создана х в начале Т2 и t2 будет читать из этой копии c1

Это зависит от многого. Если операция T1 равна , T2 увидит это значение. В противном случае T2 увидит старое значение.

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html От:

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

+0

В противном случае T2 увидит старое значение. - но откуда он увидит, поскольку старое значение больше не существует (оно находится в процессе обновления) –

+1

@Naroji Старое значение будет там до тех пор, пока T1 не обновит его. Это означает, что документация означает «Complete». Надеюсь это поможет. – goblinjuice

+0

спасибо за входные данные. Если это так, то old_value заменяется на new_value - это атомная операция (CAS), правильно? –

Смежные вопросы