java - 提高非重复并发 ArrayList 的性能

标签 java multithreading arraylist concurrenthashmap

我在实现 的数据结构时遇到了性能问题非重复 并发 ArrayList(或 ConcurrentLinkedQueue )。

public class NonDuplicateList implements Outputable {
    private Map<Term, Integer> map;
    private List<Term> terms;

    public NonDuplicateList() {
        this.map = new HashMap<>();
        this.terms = new ArrayList<>();
    }

    public synchronized int addTerm(Term term) { //bad performance :(
        Integer index = map.get(term);
        if (index == null) {
            index = terms.size();
            terms.add(term);
            map.put(term, index);
        }
        return index;
    }

    @Override
    public void output(DataOutputStream out) throws IOException {
        out.writeInt(terms.size());
        for (Term term : terms) {
            term.output(out);
        }
    }
}

请注意 TermNonDuplicateList都实现Outputable接口(interface)输出。

为了保持NonDuplicateList线程安全,我使用 synchronized守护方法addTerm(Term)当前调用 addTerm 时,性能与预期一样差.

看来ConcurrentHashMap不适合这种情况,因为它不能保持强大的数据一致性。知道如何提高 addTerm 的性能不失去其线程安全性?

编辑:
output方法,即迭代 NonDuplicateList , 可能不是线程安全的,因为在并发调用 addTerm 后只有一个线程会访问此方法, 但是 addTerm将术语添加到 NonDuplicateList 后必须立即返回索引值.

最佳答案

有可能重复使用ConcurrentHashMap如果您可以牺牲 addTerm 在您的实现中返回类型。您可以返回 boolean 而不是返回实际索引这表明添加是否成功或产生重复。这也将允许您删除方法同步并提高性能:

private ConcurrentMap<Term, Boolean> map;
private List<Term> terms;

public boolean addTerm(Term term) {
    Boolean previousValue = map.putIfAbsent(term, Boolean.TRUE);
    if (previousValue == null) {
        terms.add(term);
        return true;
    }
    return false;
}

关于java - 提高非重复并发 ArrayList 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40848206/

相关文章:

Java GPA 计算结果问题

Java - 我怎样才能在不因其他 readline 方法而跳过一行的情况下执行 read 方法

java - 如何对包含数字的字符串集合进行排序?

java - 如何在java中制作线程安全的行矩阵

c# - 如何卡住无法卡住的可卡住对象

.net - 线程池和发送电子邮件

java - 安卓重命名: unable to find explicit activity class

java - 如何获得正确的输入来获取 ArrayList 的索引?

Java 设置值从 Map 到 Set

java - 如何将 char 转换为对象