ConcurrentSkipListSet funzionamento interno, differenza rispetto a TreeSet

Aug 23 2020

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

2 deduper Aug 23 2020 at 06:40

…in che modo SkipList è concorrente quando non contiene alcuna sincronizzazione?…

TL; DRConcurrentSkipListSetè 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.SimpleImmutableEntryinternamente, garantisce che nessuno dei suoi stati ( le sue chiavi e i suoi valori ) possa essere modificato dai thread attualmente in esecuzione, perché il suo stato è immutabile .

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.