Quando è utile un ConcurrentSkipListSet?


84

Ho appena visto questa struttura dati sull'API Java 6 e sono curioso di sapere quando sarebbe una risorsa utile. Sto studiando per l'esame scjp e non lo vedo trattato nel libro di Kathy Sierra, anche se ho visto finte domande d'esame che lo menzionano.

Risposte:


175

ConcurrentSkipListSet e ConcurrentSkipListMap sono utili quando è necessario un contenitore ordinato a cui accedono più thread. Questi sono essenzialmente gli equivalenti di TreeMap e TreeSet per il codice concorrente.

L'implementazione per JDK 6 si basa su tabelle hash dinamiche senza blocco ad alte prestazioni e set basati su elenchi di Maged Michael presso IBM, il che dimostra che è possibile implementare molte operazioni sugli elenchi di salto in modo atomico utilizzando operazioni di confronto e scambio (CAS) . Questi sono privi di blocchi, quindi non devi preoccuparti del sovraccarico synchronized(per la maggior parte delle operazioni) quando usi queste classi.

Attualmente non esiste in Java un'implementazione simultanea Map / Set basata su albero rosso-nero . Ho esaminato un po 'la letteratura e ho trovato un paio di documenti che mostravano alberi RB concorrenti che superavano le liste di salto, ma molti di questi test sono stati eseguiti con la memoria transazionale , che al momento non è supportata nell'hardware su nessuna delle principali architetture.

Presumo che i ragazzi di JDK abbiano scelto un elenco di salto qui perché l'implementazione era ben nota e perché renderlo privo di blocchi era semplice e portatile (usando CAS). Se qualcuno vuole chiarire, per favore fallo. Sono curioso.


1
È anche utile se si desidera tenere traccia di record univoci in un ambiente multi-thread in modo efficiente.
anataliocs

4

Gli elenchi da saltare sono elenchi ordinati ed efficienti da modificare con le prestazioni di log (n). a questo proposito è come TreeSet. tuttavia non esiste ConcurrentTreeSet. quello che ho sentito è che la lista di salto è molto facile da implementare, questo è probabilmente il motivo.

Ad ogni modo, quando hai bisogno di un set simultaneo, ordinato ed efficiente, puoi usare ConcurrentSkipListSet


2

Sono utili quando è necessario un set a cui è possibile accedere in modo sicuro da più thread contemporaneamente. Fornisce anche prestazioni decenti essendo debolmente consistente: gli inserti possono essere effettuati in sicurezza mentre si iterano attraverso il set, ma non c'è garanzia che il tuo Iterator vedrà quell'inserto.


1

ConcurrentSkipListMap è stata una scoperta fantastica quando avevo bisogno di implementare un livello di replica per una cache coltivata in casa. Gli aspetti della mappa hanno implementato la cache e gli aspetti dell'elenco sottostanti mi hanno permesso di tenere traccia dell'ordine in cui gli oggetti apparivano nella cache. L'aspetto "salta" di quell'elenco ha reso efficiente la rimozione di un oggetto da un punto dell'elenco e lo sposta fino alla fine quando è stato sostituito nella cache.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.