2016-08-03 5 views
0

Так у меня есть объект, сделанный из QueueSet ConcurrentSkipListSet в JavaSanity проверки на dymanic набора

Помните, что, в отличие от большинства коллекций, метод размера не операция постоянная времени. Из-за асинхронности этих множеств определение текущего количества элементов требует обхода элементов и поэтому может сообщать о неточных результатах, если эта коллекция будет изменена во время обхода. Кроме того, объемные операции addAll, removeAll, keepAll, containsAll, equals и toArray не гарантируются, выполняются атомарно. Например, итератор, работающий одновременно с операцией addAll, может просматривать только некоторые из добавленных элементов.

Проблема: Существует проверка недостатков здравомыслия на этом if(!activeQueueSet.add(queue)), но как вы можете видеть из документации св О (п) операция т.е. всего набора проходится, который какой-то образом извращает состояние списка довольно много раз. Я ищу надежную проверку здравомыслия.

+0

Непонятно, что вы просите. Что делает факт, что 'size' не является постоянной операцией времени, связано с проверкой того, возвращает ли метод' add' правильное значение? –

ответ

1

Это верно, что ваш ConcurrentSkipListSet.add(element) может возвращать true или false в зависимости от того, набора в настоящее время одновременно модифицирован другой поток с использованием итератора, которое здесь weakly consistent, или с помощью объемных методов (т.е. xxxAll()), которые не являются атомарными.

Пожалуйста, обратите внимание, однако, что add() и remove() методы поточно, поэтому до тех пор, как вы измените набор с помощью только это вам будет хорошо.

Это будет ваше конкретное приложение, что с ним делать. Если элемент не был там, но добавил, это хорошо. Это так плохо, если элемент был там в первую очередь и поэтому не добавлен?

Вы можете создать класс, содержащий (или, возможно, расширение) ConcurrentSkipListSet с очень управляемым API, предотвращающим любую из проблемных операций или обеспечивающую безопасность потоков с помощью блокировок.

+0

Не так уж плохо и бывает очень редко, но все же это то, что нужно решать. Я предполагаю, что ваша идея продления будет работать. –