web-dev-qa-db-fra.com

Quand un ConcurrentSkipListSet est-il utile?

Je viens de voir cette structure de données sur l'API Java 6 et je suis curieux de savoir quand ce serait une ressource utile. J'étudie pour l'examen scjp et je ne le vois pas couvert sur le livre de Kathy Sierra, même si j'ai vu de fausses questions d'examen qui le mentionnent.

76
andandandand

ConcurrentSkipListSet et ConcurrentSkipListMap sont utiles lorsque vous avez besoin d'un conteneur trié accessible par plusieurs threads. Ce sont essentiellement les équivalents de TreeMap et TreeSet pour le code simultané.

L'implémentation de JDK 6 est basée sur tables de hachage dynamiques sans verrou haute performance et ensembles basés sur des listes par Maged Michael chez IBM, qui montre que vous pouvez implémenter de nombreuses opérations sur des listes de sauts de manière atomique en utilisant - comparer et échanger (CAS) opérations. Ceux-ci sont sans verrouillage, vous n'avez donc pas à vous soucier de la surcharge de synchronized (pour la plupart des opérations) lorsque vous utilisez ces classes.

Il n'y a actuellement pas arbre rouge-noir implémentation simultanée de Map/Set en Java. J'ai parcouru un peu la littérature et trouvé un couplepapiers qui montrait des arbres RB simultanés surpassant les listes de sauts, mais beaucoup de ces tests ont été effectués avec mémoire transactionnelle , qui n'est actuellement pas pris en charge par le matériel sur les principales architectures.

Je suppose que les gars JDK sont allés avec une liste de sauts ici parce que l'implémentation était bien connue et parce que la rendre sans verrou était simple et portable (en utilisant CAS). Si quelqu'un veut clarifier, veuillez le faire. Je suis curieux.

161
Todd Gamblin

les listes de sauts sont des listes triées et efficaces à modifier avec les performances de log (n). à cet égard, c'est comme TreeSet. cependant, il n'y a pas de ConcurrentTreeSet. ce que j'ai entendu, c'est que la liste de saut est très facile à mettre en œuvre, c'est probablement la raison.

Quoi qu'il en soit, lorsque vous avez besoin d'un ensemble simultané, trié et efficace, vous pouvez utiliser ConcurrentSkipListSet

3
irreputable

Ils sont utiles lorsque vous avez besoin d'un ensemble auquel plusieurs threads peuvent accéder simultanément en toute sécurité. Il offre également des performances décentes en étant faiblement cohérent - les inserts peuvent être fabriqués en toute sécurité pendant que vous parcourez l'ensemble, mais rien ne garantit que votre itérateur verra cet insert.

2
Kaleb Brasee

ConcurrentSkipListMap était une découverte fantastique lorsque j'avais besoin d'implémenter une couche de réplication pour un cache d'origine. Les aspects Map ont implémenté le cache, et les aspects List sous-jacents me permettent de suivre l'ordre dans lequel les objets sont apparus dans le cache. L'aspect "ignorer" de cette liste a rendu efficace la suppression d'un objet à un endroit de la liste et son transfert à la fin lorsqu'il a été remplacé dans le cache.

1
Patrick Rusk