ConcurrentSkipListSet fonctionnement interne, différence avec TreeSet
La seule différence que je comprends est entre les itérateurs. SkipLista faiblement cohérent , tandis que TreeSeta fail-fast . En dehors de cela, je ne vois aucune méthode synchronisée à l'intérieur SkipList(bien que ce soit dans le package Concurrent).
Quelqu'un peut-il m'expliquer s'il vous plaît comment est SkipListsimultané quand il n'y a pas de synchronisation? Quels problèmes cela peut-il m'aider et pourquoi devrais-je l'utiliser autre que cette différence entre les itérateurs ?
Réponses
„ …comment SkipList est-il concurrent lorsqu'il n'y a pas de synchronisation?… “
TL; DR —ConcurrentSkipListSetest concurrent car les éléments qu'il contient ne peuvent pas être écrits en même temps en exécutant simultanément des threads. Il réalise sa concurrence sans utilisersynchronizedni verrous.
La version longue
La simultanéité dans le contexte des collections concurrentes ne signifie pas nécessairement que ces classes implémentent toutes la sécurité des threads à l'aide de moniteurs ( alias, le synchronizedmot clé ).
Tout d'abord, vous devez comprendre que la sécurité des threads consiste essentiellement à s'assurer que deux ou plusieurs threads concurrents ne modifient pas l'état partagé d'une application. Ensuite, vous vous rendez compte qu'il existe des moyens ( certains plus performants ) autres que synchronizedd'atteindre la sécurité des threads.
S'assurer que votre état ne peut pas être modifié ( qu'il est immuable ) en premier lieu est un moyen simple mais très efficace d'obtenir la sécurité des threads.
En outre, une classe peut être thread-safe en déléguant ses responsabilités de sécurité des threads à une autre classe thread-safe.
ConcurrentSkipListSetest considéré comme concurrent car, comme le dit son Javadoc, ses : „ Les opérations d'insertion, de suppression, de mise à jour et d'accès s'exécutent en toute sécurité simultanément par plusieurs threads “.
Il atteint sa concurrence parce qu'il délègue ses responsabilités de sécurité des threads à une classe thread-safe ; à savoir : ConcurrentSkipListMap.
ConcurrentSkipListSetest thread-safe car l' ConcurrentSkipListMapest. Et ConcurrentSkipListMapest thread-safe car, en utilisant en AbstractMap.SimpleImmutableEntry
Vous pouvez voir ConcurrentSkipListSetla délégation ConcurrentSkipListMapà plusieurs endroits dans le code source auquel j'ai lié ci-dessus. Si vous souhaitez en savoir plus sur la délégation de la sécurité des threads , je vous recommande de lire Chapter 4, Composer des objets, Java Concurrency In Practice .
„ … Pour quels problèmes cela peut-il m'aider “
L'utiliser vous permet d'obtenir une sécurité des threads gratuite . Le genre qui est bien plus performant — et avec bien moins de risque de se tirer une balle dans le pied — que d'utiliser synchronized.
„ …pourquoi devrais-je l'utiliser autre que cette différence entre les itérateurs ? "
Si l'état de votre application doit être stocké dans une collection et que cette collection sera accessible de quelque manière que ce soit aux threads exécutés simultanément, alors l'utilisation ConcurrentSkipListSetest une option thread-safe que vous avez.