ConcurrentSkipListSet funzionamento interno, differenza rispetto a TreeSet
L'unica differenza che capisco è tra gli iteratori. SkipListha debolmente consistente , mentre TreeSetha fail-fast . A parte questo, non vedo alcun metodo sincronizzato all'interno SkipList(sebbene sia nel pacchetto Concurrent).
Qualcuno può spiegarmi come è SkipListconcorrente 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 utilizzaresynchronizede 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 synchronizedparola 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 synchronizeda 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é ConcurrentSkipListMaplo è. Ed ConcurrentSkipListMapè thread-safe perché, utilizzando AbstractMap.SimpleImmutableEntry
Puoi vedere ConcurrentSkipListSetla delega a ConcurrentSkipListMapin 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.