5

Java API を知らない .NET 専門家のために要約すると、次のようになります。

Java のConcurrentHashMapには、次のような一般的な Map 変更操作のためのアトミック メソッド (つまり、外部ロックを必要としない) があります。

putIfAbsent(K key, V value)
remove(Object key, Object value)
replace(K key, V value)

また、ロックせずにキーセットを反復処理することもでき (反復の開始時にコピーが取得されます)、get()操作は通常、ブロックせずに への呼び出しとインターリーブできますput()(細かい粒度のロック ストライピングIIRCを使用します)。

とにかく、私の質問は次のとおりです。.NET には同等の Dictionary 実装がありますか?

より一般的には、.NET にスレッド セーフなコレクション ライブラリのより一般的なセットがあるかどうか知りたいと思います。または一般的な同時実行ユーティリティ - Doug Leajava.util.concurrentライブラリに相当します。

4

4 に答える 4

16

着信 .Net 4.0 にはConcurrentDictionaryクラスがあり、便利な GetOrAddメソッドがあります。

public TValue GetOrAdd(
    TKey key,
    Func<TKey, TValue> valueFactory
)

グローバル サーバー キャッシュに非常に役立ちます。

于 2010-01-02T22:14:34.313 に答える
3

編集:これは.NET 4がリリースされる前に書かれたもので、明らかにConcurrentDictionary. .NET 3.5 が必要な方の参考としてここに残しておきます。

に相当するものは知りませんConcurrentHashMap

Mutex一般的な同時実行ユーティリティに関して - .NET は常に、Java が提供していた基本機能よりも少し多くの機能を提供してきましManualResetEventた。それから最近では (.NET 2.0)と (.NET 3.5) - もちろん、プロセス全体のスレッド プールも同様です。AutoResetEventReaderWriterLockSemaphoreReaderWriterLockSlim

Parallel Extensions が登場すると、.NET 4.0 でさらに大きな変化が起こります。これにより、同時実行がはるかに簡単になるはずです。同様に、Coordination and Concurrency Runtimeは、最終的に Microsoft Robotics Studio の足枷から解放されますが、それがどこに向かっているのか (.NET 自体の一部になるのか、別のライブラリになるのか) は正確にはわかりません)。

于 2008-11-12T09:16:43.263 に答える
2

私が知っていることではありません。あなたが探しているものに最も近いのは、おそらく、ハッシュテーブルの (一種の) スレッドセーフなラッパーを返す Hashtable の Synchronized メソッドでしょう。ただし、複数のライターまたは複数のリーダーに対してのみスレッドセーフです。私の記憶が正しければ、ライターとリーダーの混合はスレッドセーフではありません。

于 2008-11-12T09:25:25.273 に答える
2

個人的には、個々のメソッドを同期させることは、一般的に思ったほど役に立たないことがわかりました。

一般に、関連する「get」と「put」を連続して実行したい場合があり、別のスレッドが同じ値を見ている場合は、すぐにスレッド競合が発生します。同様に (シナリオによっては)、作業中の値を誰かに読み取られたくありません。

広範なアプローチでは、単純に外部Monitor(を使用するlock(...)だけで、多くの状況でうまく機能します。これはシンプルで軽量であり、スレッドの負荷が大きい場合を除き十分すぎるほどです。

より複雑なシナリオでは、ReaderWriterLockSlimなどのものがより柔軟になります。しかし、私は単純に始めて、プロファイリングで本当に競合の問題があることを示した場合にのみ、物事を変更します。

Jon が指摘しているように、Parallel Extension にはまったく新しい高性能同期デバイスが多数登場します。私が見ることができるもの (たとえば、ここここここ) から、これは .NET 4.0 の一部です。

于 2008-11-12T09:46:44.450 に答える