Когда ConcurrentSkipListSet полезно?
Я только что видел эту структуру данных на Java 6 API, и мне любопытно, когда это будет полезным ресурсом. Я учусь на экзамене scjp, и я не вижу его в книге Кэти Сьерра, хотя я видел макеты экзаменационных вопросов, которые упоминают об этом.
4 ответа:
ConcurrentSkipListSet и ConcurrentSkipListMap полезны, когда вам нужен сортированный контейнер, к которому будут обращаться несколько потоков. Это, по существу, эквивалентами дерева и TreeSet для параллельного кода.
реализация для JDK 6 основана на высокопроизводительные динамические хэш-таблицы без блокировки и наборы на основе списков от Maged Michael в IBM, который показывает, что вы можете реализовать множество операций в списках пропусков атомарно используя сравнить и поменять местами (CAS) операции. Они без блокировки, так что вам не придется беспокоиться о накладных расходах
synchronized
(для большинства операций) при использовании этих классов.в настоящее время нет красно-черное дерево на основе параллельной реализации Map / Set в Java. Я немного просмотрел литературу и нашел парастатьи это показало, что параллельные деревья RB превосходят списки пропусков, но многие из них тесты были сделаны с транзакций, который на данный момент не поддерживается в аппаратных средствах на любых крупных архитектурах.
Я предполагаю, что ребята из JDK пошли со списком пропусков здесь, потому что реализация была хорошо известна и потому что ее блокировка была простой и портативной (с использованием CAS). Если кто-то хочет уточнить, пожалуйста. Мне любопытно.
списки пропуска сортируются списки и эффективны для изменения с помощью log(n) performance. в этом отношении это похоже на TreeSet. однако нет ConcurrentTreeSet. я слышал, что список пропусков очень прост в реализации,вот почему.
в любом случае, когда вам нужен параллельный, сортированный и эффективный набор, Вы можете использовать ConcurrentSkipListSet
Это полезно, когда вам нужен набор, который может безопасно использоваться несколькими потоками одновременно. Он также обеспечивает достойную производительность, будучи слабо последовательным - вставки могут быть сделаны безопасно, пока вы повторяете набор, но нет никакой гарантии, что ваш итератор увидит эту вставку.
ConcurrentSkipListMap был фантастической находкой, когда мне нужно было реализовать слой репликации для домашнего кэша. Аспекты карты реализовали кэш, а базовые аспекты списка позволили мне отслеживать порядок, в котором объекты появились в кэше. "Пропустить" аспект этого списка сделал его эффективным, чтобы удалить объект из одного места в списке и поднять его до конца, когда он был заменен в кэше.