У меня есть коллекция объектов, которая изменяется одним потоком и читается другим (точнее, EDT).Мне нужно было решение, которое дало бы мне быстрый поиск, а также быструю индексацию (в порядке вставки), поэтому я использую ConcurrentHashMap с сопровождающим ArrayList ключей, поэтому, если вы хотите проиндексировать запись, я могу проиндексировать список дляключ, а затем используйте возвращенный ключ, чтобы получить значение из хэш-карты.Итак, у меня есть класс-обертка, который гарантирует, что при добавлении записи добавляется отображение в хэш-карту и ключ добавляется в список одновременно, аналогично для удаления.
Я публикуюПример кода, о котором идет речь:
private List<K> keys = Collections.synchronizedList(new ArrayList<K>(INITIAL_CAPACITY));
private ConcurrentMap<K, T> entries = new ConcurrentHashMap<K, T>(INITIAL_CAPACITY, .75f);
public synchronized T getEntryAt(int index){
return entries.get(keys.get(index));
}
**public synchronized void addOrReplaceEntry(K key, T value){
T result = entries.get(key);
if(result == null){
entries.putIfAbsent(key, value);
keys.add(key);
}
else{
entries.replace(key, result);
}
}**
public syncrhonized T removeEntry(K key, T value){
keys.remove(key);
entries.remove(key, value);
}
public synchronized int getSize(){
return keys.size();
}
Мой вопрос таков: теряю ли я все преимущества использования ConcurrentHashMap (по сравнению с syncrhonized hashmap), работая с ним синхронизированными методами?Я должен синхронизировать методы для безопасного изменения / чтения из ArrayList ключей (CopyOnWriteArrayList не вариант, потому что много изменений происходит ...) Кроме того, если вы знаете лучший способ сделать это, это будет оценено...