我有一组由一个线程修改并由另一个线程(更具体地说是 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(通过同步哈希图)的所有好处?我必须同步方法以安全地从键的 ArrayList 修改/读取(CopyOnWriteArrayList 不是一个选项,因为会发生很多修改......)另外,如果您知道更好的方法来做到这一点,那将不胜感激。 ..