Domanda

In genere (es. Non contemporaneamente), putAll() non può essere più efficiente rispetto all'utilizzo di una sacco di chiamate al put(), anche supponendo che si esclude il costo di costruzione l'altra mappa che si passa a putAll(). Questo perché putAll() avrà bisogno di iterare gli elementi del passato della mappa, così come in esecuzione attraverso l'algoritmo per l'aggiunta di ciascuna coppia di valori chiave per la mappa che put() esegue.

Ma per un ConcurrentHashMap, ha senso costruire un regolare Mappa e quindi utilizzare putAll() per aggiornarlo? O devo solo fare 10 (o 100, o 1000) chiama a put()?

Il cambiamento risposta per chiamate multiple a putIfAbsent()?

Grazie!

È stato utile?

Soluzione

La prima (per lo più) threadsafe Mappa in Java collezioni è stato il sincronizzato HashMap utilizzando Collections.synchronizedMap() . Ha funzionato consentendo solo una sola operazione alla volta. Java 5 ha aggiunto il ConcurrentHashMap , che funziona in modo diverso. Fondamentalmente il Map è diviso in fette. Un put() operazione si blocca solo la fetta rilevante. Ha anche aggiunto le primitive THREADSAFE come putIfAbsent() .

Il motivo che mi spiego questo è che putAll() potrebbe essere più o meno efficiente a seconda di come viene implementato. Può funzionare bloccando l'intera mappa, che può essere effettivamente più efficiente che cercare di ottenere singoli blocchi su ogni put(). Oppure può lavorare facendo un po 'di chiamate put() in ogni caso, in questo caso non c'è molta differenza.

Quindi, se ha un senso per il codice e si sta facendo un sacco di aggiornamenti in una volta, vorrei utilizzare putAll() meno che non sia putIfAbsent() che siete dopo.

Modifica Ho appena controllato, il ConcurrentHashMap Java 6 implementa putAll() come un ciclo di operazioni put() quindi non è migliore o peggiore di fare da soli è

.

Altri suggerimenti

putAll() pochi delegati per put(). Non c'è bisogno di costruire una mappa intermedia se non lo avete già. Si può vedere questo nel codice sorgente, e non importa che cosa implementazione Java si sta utilizzando, dato che il codice è di dominio pubblico e condiviso da tutti loro.

Si noti che putAll() non è atomico, ma semplicemente ha la garanzia che ogni individuo put() è atomica.

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