2009-12-15 6 views
64

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 dans le livre de Kathy Sierra, même si j'ai vu des questions d'examen blanc qui le mentionnent.Quand est-ce qu'un ConcurrentSkipListSet est utile?

Répondre

131

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 concurrent. L'implémentation pour JDK 6 est basée sur High Performance Dynamic Lock-Free Hash Tables and List-Based Sets par Maged Michael chez IBM, ce qui montre que vous pouvez implémenter beaucoup d'opérations sur des listes de sauts de manière atomique en utilisant les opérations compare and swap (CAS). Ceux-ci sont sans verrou, donc vous n'avez pas à vous soucier de la surcharge de synchronized (pour la plupart des opérations) lorsque vous utilisez ces classes.

Il n'y a actuellement aucune implémentation Map/Set simultanée basée sur Red-Black tree en Java. J'ai parcouru un peu la littérature et trouvé un couplepapers qui montrait que les arbres RB concurrents surpassaient les listes de sauts, mais beaucoup de ces tests ont été faits avec transactional memory, ce qui n'est pas supporté dans le matériel sur les architectures majeures pour le moment. Je suppose que les gars du JDK sont allés avec une liste de saut 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 se soucie de clarifier, s'il vous plaît faire. Je suis curieux.

+1

Il est également utile si vous souhaitez effectuer le suivi des enregistrements uniques dans un environnement multithread d'une manière performante. – anataliocs

1

Les listes de sélection sont des listes triées et efficaces pour modifier 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 sauts est très facile à mettre en œuvre, c'est probablement pourquoi.

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

2

Elles sont utiles lorsque vous avez besoin d'un ensemble qui peut en toute sécurité accessible par plusieurs threads simultanément. Il fournit également des performances correctes en étant faiblement cohérent - les insertions peuvent être effectuées en toute sécurité pendant que vous parcourez le Set, mais il n'y a aucune garantie que votre Iterator verra cet insert.

1

ConcurrentSkipListMap était une trouvaille fantastique quand j'ai dû implémenter une couche de réplication pour un cache développé en interne. Les aspects Map ont implémenté le cache et les aspects List sous-jacents m'ont permis de suivre l'ordre dans lequel les objets sont apparus dans le cache. L'aspect "skip" de cette liste rendait efficace le fait de retirer un objet d'un endroit de la liste et de le déplacer à la fin lorsqu'il était remplacé dans le cache.

Questions connexes