2016-02-12 5 views
5

スレッドの安全性を維持しながら、複数の同時データ構造にどのようにアクセスできますか?同期なしでこれを行うことは可能ですか?簡単な例として複数の同時データ構造へのスレッドセーフなアクセス

ConcurrentHashmap m; 
CopyOnWriteArrayList l; 

public bool enterListNode(int elem) { 
    Node node = l.get(elem); 
    String key = node.key(); //key is immutable 
    int val = node.val(); //val is immutable 
    val = m.putIfAbsent(key, val); 
    return val; 
} 

それは(node==l.get(elem))はもはや真実ではないことを、我々はputIfAbsent(key, val)を行う際いる可能性がありますので、この例では、線形化されていません。

ロックを追加する以外の方法はありますか?

+3

これは、外部の情報源(例)を求めているため、話題に近づくほど危険に遭いそうな良い質問です。私はその問題を避けるために言い換えました。変更が多すぎると感じた場合は、元に戻すか編集することができます。あなたは[ヘルプ]を見直し、[質問]にポインタを読むこともできます。この具体的な例の –

+0

は、あなたが言いたいことは、あなたが提供する必要がある保証に応じて、完全には機能しません(つまり、mが少し遅れていればいいかもしれません)。一般的なケースでは、本当にこの質問に答えることはできません。 – jtahlborn

答えて

0

たとえば、リストに入れたオブジェクトlが決して置換されず、オブジェクトNodeに含まれる値だけが変更された場合、ロックは必要ありません。しかし、プログラムの始めに空のオブジェクトを配列に書き込む必要があるため、実装するのは難しいでしょう。

リストから取得されたすべてのオブジェクトは、リストと同じになり、安全です。

関連する問題