2012-03-29 11 views
4

私は 'マルチスレッド'アプリケーションで 'concurrentHashMap'を使用しています。私はhereのようにそれを並べ替えることができました。しかし、私はハッシュマップをリストに変換しているので、私は少し安全だと心配しています。私の 'ConcurrentHashMap'は静的変数なので、インスタンスが1つしかないことを保証できます。しかし、私はそれを並べ替えるつもりです、私はそれをリストに変換し、ソートして新しいコンカレントハッシュマップに戻します。並行ハッシュマップをthreadsaftyでソート

マルチスレッドの普及ではこれは良い方法ですか?

あなたのご意見やご提案をお知らせください。

ありがとうございます。

+1

並行処理とは別に、ソートされたHashMapなどはありません。値をリストにコピーしてリストをソートすることもできますが、リストの値を取り出してHashMapに戻すと、ハッシュ順に戻ります。 (LinkedHashMapがありますが、その並行バージョンはありません。) – Wyzard

+0

@Wyzard - 私はそれを私のコンパレータに従ってソートし、新しいconcurrentHashMapを作成し、ソートされた方法でリスト内のループの中に置くのですか? – Sam

+1

ソートされたリストの要素を新しいConcurrentHashMapに格納し、そのマップを反復処理すると、要素は元のConcurrentHashMapと同じ順序であることがわかります。ソートされたリスト内の順序ではありません。 。 – Wyzard

答えて

1

あなたはそれをたくさん変更しないと、あなたが望むすべては、それがソート持っているのであれば、あなたはあなたのコードはこのようなものになるだろう** Collections.synchronizedMap()コール

によってラップTreeMap **を使用する必要があります:

public class YourClass { 
    public static final Map<Something,Something> MAP = Collections.synchronizedMap(new TreeMap<Something,Something>()); 
} 
+0

お返事ありがとうございます。私はこの種の地図を使ったことがありません。私はいくつかの例を検索し、いくつかの例があれば教えてください。私は今、TreeMap APIを使います。ありがとうございました。 – Sam

6

ConcurrentSkipListMapを使用してください。これは、スレッドセーフで高速であり、オブジェクトの同等の実装に従って順序付けを維持します。

+0

帰りに感謝します。私はConcurrentSkipListMapについて得ることができる例はありますか?私はそれを使用したことがない。あなたが何かを持っているなら私に知らせてください。私はそれに取り組み始めます。 – Sam

+0

@Sam Comparableインターフェイスを見てください。 Mapの各キーがComparable型である場合、各putは自動的にマップ自体を並べ替えます。それは、TreeMapと同様の機能と時間の複雑さを持っています。 –

0

私の 'ConcurrentHashMap'は静的変数なので、インスタンスが1つしかないことを保証できます。しかし、私はそれを並べ替えるつもりです、私はそれをリストに変換し、ソートして新しいコンカレントハッシュマップに戻します。

これは単純な問題ではありません。

私はConcurrentHashMapを使用してもスレッドセーフではないという事実を伝えることができます。また、synchronizedMapラッパーを使用することもありません。問題は、並べ替えが単一のアトミック操作としてサポートされていないことです。むしろマップAPI操作のシーケンスを含み、おそらくそれらの間にかなりの時間差があります。

私はこれを解決するには、2つの方法を考えることができます順番にキーを保持します地図を使って、最初の場所に並べ替えの必要性を避け

  • 。例えばConcurrentSkipListMapを使用します。

  • 同期されたラッパークラスのMapクラスを、同期化されたsortメソッドでラップします。このアプローチの問題は、ConcurrentHashMapを使用して避けた同時性ボトルネックを再導入する可能性が高いことです。


そして、これらのマップは、あなたが要素を並べ替えるそこに順序を保持しませんので、それはHashMapまたはConcurrentHashMapをソートするためには何の意味も持たないことを指摘する価値があります。エントリの挿入順序を保持するLinkedHashMapを使用できます。

+0

ステファンありがとうございます。しかし、私は '同期'ブロック内のコードを使用する場合はどうなりますか?その理由は、hashmapに挿入する前にソート値のスレッドsafty.thinkingでソートされたリストのみを含むconcurrenthashmapについて確かめる必要があるからです。 – Sam

+0

@Sam - 同期されたブロック内のソートを行うことは、マップの他のすべての使用も同じオブジェクトで同期する場合にのみ役立ちます。そして、並行処理のボトルネックにつながる可能性があります... –

関連する問題