データ構造(重複しない)並行ArrayList(またはConcurrentLinkedQueue
)のデータ構造を実装すると、パフォーマンスの問題が発生しました。非重複並行ArrayListのパフォーマンスを向上
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);
}
}
}
Term
とNonDuplicateList
が両方の出力へOutputable
インタフェースを実装することに留意されたいです。
NonDuplicateList
スレッドセーフに保つために、私はこの方法addTerm(Term)
を守るためを使用すると、パフォーマンスは現在addTerm
を呼び出すときに、予想ほど悪くなります。
データ整合性が強くないため、ConcurrentHashMap
はこのケースには適していないようです。スレッド安全性を失うことなくaddTerm
のパフォーマンスをどのように改善するか考えてみませんか?
EDIT:NonDuplicateList
て
output
方法、すなわち反復、一つだけのスレッドが同時にaddTerm
を起動した後に、このメソッドにアクセスするので、スレッドセーフではないかもしれませんが、addTerm
とすぐ用語として、直ちにインデックス値を返す必要がありますNonDuplicateList
に追加されます。
'ConcurrentHashMapはこのケースには適していないようです。なぜなら、データの一貫性が保たれていないからです - 説明してください。 – OldCurmudgeon
あなたの行ったことに対してConcurrentHashMapを使用する、独自のリストを作成しない – borowis
@OldCurmudgeon私は、ConcurrentHashMapにキーと値のペアを入れた後、他のスレッドはこの変更を直接見ることができないと聞いたことがありますか?私の場合、重複要素は許されないので、この種の矛盾は適切ではないようです。 – dawnwords