У меня есть 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
Пожалуйста, помогите мне найти лучший подход.