Domanda

Ho esaminato il problema di scrivere una simultanea Multimap, e ho un'implementazione supportata da Google Guava AbstractSetMultimap e una mappa di elaborazione di mapmaker che crea su richiesta le raccolte di valori come vista impostata su un concorrente. Con un po 'di cura per le collezioni di visualizzazioni e vari involucri, penso che questo si avvicini.

Il grosso problema, che è già stato discusso di altri chi avere Provato, sembra essere quello di rimuovere le raccolte di valori dalla mappa sottostante quando diventano vuote, senza introdurre le condizioni di gara.

Sembrano esistere un paio di opzioni.

  • Lascia lì le collezioni vuote. Questo perde alcuni CHM, ma credo che sia almeno corretto.
  • Prova in modo ottimistico a rimuovere la raccolta quando è vuoto e compensare se qualcos'altro appare in essa. Questo è pieno di razze e sembra intrinsecamente impossibile da risolvere.
  • Sincronizzare tutto sulla raccolta dei valori, che almeno consentirebbe questa rimozione, ma a costo di qualsiasi concorrenza dopo la ricerca iniziale per chiave.
  • Per una penalità più piccola (forse, a seconda dei modelli di utilizzo?), Forse sincronizzare la creazione e la rimozione della raccolta dei valori, è necessario verificare se ciò copre tutto.

Domande:

  • Qualcuno sa di una migliore implementazione di questa? Possiamo componendo meglio i pezzi di mapmaker o questo ha bisogno di una concorrenthashmultimap specializzata scritta da zero?
  • Se è difficile migliorare molto su questo, questa perdita è probabile che sia un problema nella pratica? Le raccolte notevoli come java.util.hashmap, juc.concurrenthashmap e arraydeque non ridimensionano il negozio di supporto verso il basso e ArrayList non lo fa automaticamente. Finché chiariamo gli oggetti, mi chiedo se questo importerà troppo.

Grazie


Modificare: Guarda anche la discussione qui Nella mailing list guava.


EDIT 2: Da allora l'ho scritto. Perfavore guarda Questa area del codice di Google per un'implementazione. Apprezzerei molto qualsiasi feedback da parte di chiunque lo provi, lì piuttosto che qui.

È stato utile?

Soluzione

Come follow-up, ecco alcuni dettagli ho omesso dalle discussioni precedenti, che si è collegato al, circa la mia implementazione multimap concorrente.

Questa implementazione ha seguito il tuo primo suggerimento: lasciando collezioni vuoti nella mappa di backup. Il seguente comportamento live-view complica i vostri altri suggerimenti.

Multimap<String, Integer> multimap = HashMultimap.create();
Set<Integer> set = multimap.get("foo");
multimap.put("foo", 1);
int count = set.size();   // equals 1

Per un'applicazione del mondo reale, al contrario di un libreria di classi collezione, qualcosa meno di un multimap completamente concomitante sarebbe probabilmente sufficiente. Si potrebbe definire la propria classe che implementa un sottoinsieme dell'interfaccia Multimap o una selezione limitata di garanzie di concorrenza. In alternativa, la logica dell'applicazione potrebbe ridurre al minimo contesa di un multimap sincronizzato per evitare di problemi di prestazioni.

Altri suggerimenti

ho chiesto la stessa domanda in precedenza, e ha finito per attuare 4 implementazioni diverse.

La domanda: ad alte prestazioni Concurrent MultiMap Java / Scala

L'impl (io lo chiamo Index) http: // github.com/jboner/akka/blob/master/akka-actor/src/main/scala/actor/ActorRegistry.scala#L314

Se proprio non si vuole perdere l'insieme vuoto si potrebbe provare a sostituire atomicamente con un futuro segnaposto per-chiave. In questo modo concomitante aggiungere / rimuovere o aggiungere / aggiuntivo dovrebbe essere in grado di raggiungere stato coerente durante l'espansione di nuovo.

Utilizzo collezioni immutabili come valori è il modo migliore per risolvere / semplificare le questioni fondamentali di concorrenza, come si può rimuovere con il metodo atomica sostituire. Purtroppo, ci sono collezioni non immutabili con rapido copia / profili di aggiornamento in uso generale, quindi è di solito necessario fare piuttosto costoso copiare tutto.

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