Ответ 1
Вы можете попробовать использовать Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
. Это даст вам одновременный хеш-набор, который даст вам около O (1) добавить и удалить.
У меня есть ArrayList
, который должен кэшироваться и делиться между несколькими потоками на неопределенный срок. Операции включают частые добавления и удаления, а также периодические повторы.
ArrayList
живет в классе-оболочке, который управляет доступом к нему:
public class MyListWrapper<T> implements Iterable<T> {
private List<T> innerList = new ArrayList<T>();
public Iterator<T> iterator() {
return innerList.listIterator();
}
public void add(T element) {
innerList.add(element);
//app-specific logic
}
//remove(T), etc in the same pattern...
}
В настоящее время я готовлюсь к безопасности потоков. Сначала CopyOnWriteArrayList
показался лучшим ответом, но его производительность касается меня, поскольку изменения будут производиться чаще, чем что-либо еще.
Было бы лучше изменить ручное изменение класса-оболочки таким образом, чтобы это было лучше?:
public Iterator<T> iterator() {
return new ArrayList<T>(innerList).listIterator();
}
//plus concurrency tweaks for any non-atomic modifications to innerList
Пожалуйста, помогите мне найти лучший подход.
Вы можете попробовать использовать Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
. Это даст вам одновременный хеш-набор, который даст вам около O (1) добавить и удалить.
Возможность использовать ConcurrentLinkedQueue, если вы можете жить с интерфейсом Queue вместо List. Я бы сказал, что больше случаев использования, чем вы ожидаете, может быть удовлетворено очередью. Одним из ключевых преимуществ List является произвольный доступ (основанный на индексе), но в параллельной ситуации произвольный доступ не является ни необходимым, ни желательным.
ConcurrentLinkedQueue - превосходная параллельная реализация очереди.