2010-11-04 20 views
7

Ho sempre pensato che lo ConcurrentHashMap e le classi simili (che mantengono gli aggiornamenti sincronizzati e non sincronizzino le letture) hanno fatto una cosa molto utile e intuitiva: non hanno bloccato le letture e bloccato tutte le funzionalità sugli aggiornamenti. E una strategia del genere mantiene tutto coerente.ConcurrentHashMap: che senso ha solo il blocco degli aggiornamenti?

ma ho letto attentamente la documentazione, e ha aperto la realizzazione di ConcurrentHashMap, e mi pare di capire ora, è non blocco legge quando un altro thread sta eseguendo gli aggiornamenti. E se un thread inizia a fare putAll(hugeCollection) e un altro thread si ripete allo contains(theSameObjectForAllCalls) allo stesso tempo, allora è più probabile che il secondo thread ottenga risultati diversi mentre putAll funziona ancora.

Ecco la parte correlata dalla documentazione:

Per operazioni di aggregazione come putAll e chiari, concomitanti recuperi possono riflettere inserimento o la rimozione di solo alcune voci.

Un'altra cosa interessante è che:

Retrievals riflettono i risultati delle più recentemente completato l'aggiornamento operazioni che tengono al loro esordio.

Questo non funziona a causa di qualche blocco, ma perché viene dapprima viene aggiunto un nuovo oggetto e solo dopo che gli oggetti contatore viene incrementato e l'oggetto diventa visibile per operazioni di lettura.

Quindi, qual è il punto centrale degli aggiornamenti di blocco?

risposta

4

Brian Goetz ha spiegato il funzionamento in uno article a lavori di sviluppo. Questo dovrebbe aiutare.

+1

Grazie al cielo per Brian e Doug, i loro libri mi hanno salvato molte volte navigando in alto mare di concorrenza. –

4

Queste classi offrono un ulteriore controllo dei compromessi sulla concorrenza rispetto alla coerenza. Se quello che vuoi veramente è avere letture atomiche e coerenti, procurati una hashmap sincronizzata. Tuttavia, se hai bisogno di più concorrenza, puoi ottenere una ConcurrentHashMap, purché tu sappia che le letture avranno un quadro accurato di come appariva la mappa a un certo punto, ma non necessariamente ora.

Il compromesso è che devi pensare più duramente alla coerenza dei dati, ma la tua app può avere una concorrenza molto maggiore.

+0

aye, tendo a pensarlo come l'accuratezza rispetto alle prestazioni in questo modo. – Toby

Problemi correlati