Подтвердить что ты не робот

Альтернативой CopyOnWriteArrayList для частой записи, периодической итерации

У меня есть 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

Пожалуйста, помогите мне найти лучший подход.

4b9b3361

Ответ 1

Вы можете попробовать использовать Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());. Это даст вам одновременный хеш-набор, который даст вам около O (1) добавить и удалить.

Ответ 2

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

ConcurrentLinkedQueue - превосходная параллельная реализация очереди.