Intuitivamente, una ConcurrentHashMap deve comportarsi come un insieme di variabili volatili; le chiavi della mappa sono gli indirizzi variabili. get(key)
e put(key, value)
dovrebbero comportarsi come leggere e scrivere volatili.
Ciò non è esplicitamente indicato nel documento. Tuttavia, credo fermamente che sia così. Altrimenti ci saranno molti comportamenti inaspettati e sorprendenti che minano la logica dell'applicazione. Non credo che Doug Lea lo farebbe a noi. Per sicurezza, qualcuno lo chieda sulla mailing list concurrency-interest
.
Suppongo che non obbedisce la semantica volatili, possiamo ragionare sulla base di Java Memory Model -
Tutti volatili letture e scritture formano un unico ordine totale. Questo può essere considerato una linea di tempo pseudo, dove le letture/scritture sono punti su di esso.
Una lettura volatile vede la scrittura volatile immediatamente precedente e vede solo quella scrittura. "Preceding" qui è secondo la linea del tempo pseudo.
La riga di pseudo tempo può differire dalla linea del tempo "reale". Tuttavia, in teoria, una scrittura volatile non può essere posticipata all'infinito sulla linea dello pseudo tempo. E, in pratica, due linee temporali sono piuttosto vicine.
Pertanto, possiamo essere certi che, una scrittura volatile dovrebbe diventare visibile "molto rapidamente" da leggere.
Come pensate di leggere i dati? –
utilizzando get semplice() –
Quindi non dovresti preoccuparti, restituirà il valore più preciso. –