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?
Grazie al cielo per Brian e Doug, i loro libri mi hanno salvato molte volte navigando in alto mare di concorrenza. –