Когда используется ConcurrentSkipListSet?

Я только что увидел эту структуру данных в Java 6 API, и мне интересно, когда это будет полезный ресурс. Я учусь на экзамен scjp, и я не вижу, чтобы это было наложено на книгу Кэти Сьерра, хотя я видел макет экзаменационных вопросов, которые упоминают об этом.

Ответ 1

ConcurrentSkipListSet и ConcurrentSkipListMap полезны, когда вам нужен отсортированный контейнер, к которому будут доступны несколько потоков. Это, по существу, эквиваленты TreeMap и TreeSet для параллельного кода.

Реализация JDK 6 основана на высокопроизводительных динамических таблицах Hash и наборах на основе списка, созданных Maged Michael в IBM, что показывает, что вы можете реализовать множество операций в списках пропусков с помощью операций сравнения и свопинга (CAS). Они не блокируются, поэтому вам не нужно беспокоиться о накладных расходах synchronized (для большинства операций) при использовании этих классов.

В настоящее время нет Red-Black tree на основе параллельной реализации Map/Set в Java. Я немного просмотрел литературу и нашел пару статей, в которых показывались параллельные деревья RB, превосходящие списки пропусков, но многие из этих тестов были выполнены с транзакционной памятью, которая на данный момент не поддерживается аппаратными средствами на каких-либо крупных архитектурах.

Я предполагаю, что ребята JDK отправились с перечнем здесь, потому что реализация была хорошо известна, и потому что ее блокировка была простой и портативной (с использованием CAS). Если кто-то хочет уточнить, пожалуйста, сделайте. Мне любопытно.

Ответ 2

списки пропусков списков сортируются и эффективны для изменения с помощью производительности журнала (n). в этом отношении это похоже на TreeSet. однако нет ConcurrentTreeSet. я слышал, что список пропусков очень прост в реализации, возможно, почему.

В любом случае, когда вам нужен параллельный, отсортированный и эффективный набор, вы можете использовать ConcurrentSkipListSet

Ответ 3

Это полезно, когда вам нужен набор, к которому можно безопасно получить доступ несколькими потоками одновременно. Он также обеспечивает достойную производительность благодаря слабому согласованию - вставки можно сделать безопасно, пока вы выполняете итерацию через Set, но нет никакой гарантии, что ваш Iterator увидит эту вставку.

Ответ 4

ConcurrentSkipListMap был фантастической находкой, когда мне нужно было реализовать уровень репликации для домашнего кеша. В аспектах карты реализован кеш, а основные аспекты List позволяют отслеживать порядок появления объектов в кеше. Аспект "пропустить" этого списка позволил эффективно удалить объект из одного места в списке и отбросить его до конца, когда он был заменен в кеше.