Domanda

navi JDK con implementazioni CopyOnWrite* per Set e List, ma nessuno per Map e spesso mi sono lamentato questo fatto. So che ci sono altre collezioni implementazioni là fuori che li hanno, ma sarebbe bello se uno spedito di serie. Sembra un'omissione ovvia e mi chiedo se ci fosse un motivo buono per lui. Chiunque qualche idea del perché questo è stato lasciato fuori?

È stato utile?

Soluzione

Credo che questo dipende dal vostro caso d'uso, ma perché si avrebbe bisogno di un CopyOnWriteMap quando si dispone già di un ConcurrentHashMap ?

Per una tabella di ricerca pianura con molti lettori e solo uno o alcuni aggiornamenti è una buona misura.

Rispetto ad una copia sulla raccolta di scrittura:

Leggi concorrenza:

uguale a una copia sulla raccolta scrittura. Diversi i lettori possono recuperare gli elementi dalla mappa contemporaneamente in un senza blocchi della moda.

Scrivi concorrenza:

Meglio concorrenza rispetto alla copia su collezioni di scrittura che, in fondo serializzare gli aggiornamenti (un aggiornamento alla volta). Utilizzando un hash concomitante mappa si ha una buona possibilità di fare diversi aggiornamenti contemporaneamente. Se le chiavi di hash sono equamente distribuiti.

Se do vuole avere l'effetto di una copia su carta di scrittura, si può sempre inizializzare un ConcurrentHashMap con un livello di concorrenza di 1.

Altri suggerimenti

Il modo più semplice attuazione di una serie di solito quella di utilizzare una mappa sottostante. Hanno anche un Collections.newSetFromMap () Metodo [forse da 1.6 solo].

Che cosa avrebbero dovuto fare era avere un CopyOnWriteMap e la CopyOnWriteSet equivalente a Collections.newSetFromMap (nuova CopyOnWriteMap ()).

Ma, come si può vedere la CopyOnWriteArraySet è in realtà sostenuta da un non allineamento una mappa. E non sarebbe Collections.newSetFromMap (ConcurrentHashMap ()) essere accettabile per il vostro caso d'uso?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top