ConcurrentSkipListSet funzionamento interno, differenza rispetto a TreeSet
L'unica differenza che capisco è tra gli iteratori. SkipList
ha debolmente consistente , mentre TreeSet
ha fail-fast . A parte questo, non vedo alcun metodo sincronizzato all'interno SkipList
(sebbene sia nel pacchetto Concurrent).
Qualcuno può spiegarmi come è SkipList
concorrente quando non ha alcuna sincronizzazione? Con quali problemi può aiutarmi e perché dovrei mai usarlo oltre a questa differenza tra Iteratori?
Risposte
„ …in che modo SkipList è concorrente quando non contiene alcuna sincronizzazione?… “
TL; DR —ConcurrentSkipListSet
è concorrente perché gli elementi che contiene non possono essere scrittieseguendo contemporaneamente thread. Raggiunge la sua concorrenza senza utilizzaresynchronized
e blocca.
La versione lunga
La concorrenza nel contesto delle raccolte simultanee non significa necessariamente che tutte le classi implementano la sicurezza dei thread utilizzando i monitor ( ovvero la synchronized
parola chiave ).
Innanzitutto dovresti capire che la sicurezza dei thread consiste essenzialmente nel garantire che due o più thread concorrenti non modifichino lo stato condiviso di un'applicazione. Quindi ti rendi conto che ci sono modi ( alcuni più performanti ) oltre synchronized
a raggiungere la sicurezza del thread.
Assicurarsi che il tuo stato non possa essere modificato ( che sia immutabile ) in primo luogo è un modo semplice ma molto efficace per ottenere la sicurezza del thread.
Inoltre, una classe può essere thread-safe delegando le sue responsabilità di thread safety a una classe thread-safe diversa.
ConcurrentSkipListSet
è considerato simultaneo perché, come dice il suo Javadoc, è: " Le operazioni di inserimento, rimozione, aggiornamento e accesso vengono eseguite in modo sicuro contemporaneamente da più thread ".
Raggiunge la sua concorrenza perché delega le sue responsabilità di thread safety a una classe thread-safe ; vale a dire: ConcurrentSkipListMap
.
ConcurrentSkipListSet
è thread-safe perché ConcurrentSkipListMap
lo è. Ed ConcurrentSkipListMap
è thread-safe perché, utilizzando AbstractMap.SimpleImmutableEntry
Puoi vedere ConcurrentSkipListSet
la delega a ConcurrentSkipListMap
in diversi punti del codice sorgente che ho collegato sopra. Se sei interessato a saperne di più sulla delega della thread safety , ti consiglio di leggere il Capitolo 4, Composizione di oggetti, Java Concurrency In Practice .
„ …Con quali problemi può aiutarmi “
Usarlo ti dà la sicurezza del thread gratuita . Il tipo che è molto più performante - e con meno rischi di spararti ai piedi - rispetto all'utilizzo di synchronized
.
„ ... perché dovrei mai usarlo diverso da questa differenza tra gli iteratori? “
Se lo stato della tua applicazione deve essere archiviato in una raccolta e tale raccolta sarà accessibile in qualsiasi modo ai thread in esecuzione contemporaneamente, l'utilizzo ConcurrentSkipListSet
è un'opzione thread-safe che hai.