6

System.Collections.QueueクラスにQueue.Synchronizedは、スレッドセーフな Queue 実装を返すメソッドがあります。

しかし、一般的なものにはメソッドSystem.Collections.Generic.Queue がありませんSynchronized。この時点で、私は次の 2 つの質問を念頭に置いています。

  1. 一般的なものにこのメソッドがないのはなぜですか? フレームワーク API の設計上の決定ですか?
  2. 返されるキューは クラスとどうQueue.Synchronized違うのですか?ConcurrentQueue<T>

ありがとう。

4

1 に答える 1

13

メソッドは、すべてのSynchronized()メソッドをロックするラッパー キューを返します。
このパターンは、マルチスレッド アプリケーションを作成する場合には実際には役に立ちません。

実際の使用パターンのほとんどは、同期されたコレクションにはメリットがありません。高レベルの操作に関しては引き続きロックが必要です。

したがって、これらのSynchronized()メソッドSystem.Collectionsは実際には、スレッドセーフでないコードを書くように人々を導く罠です。


このConcurrentQueue<T>クラスは、並行アプリケーション用に特別に設計されており、キューをアトミックに変更する便利なメソッドが含まれています。

並行コレクション パッケージには、マルチスレッド環境で使用する意味のあるメソッドのみが含まれています (例: TryDequeue())。これらは、実際にスレッドセーフなコードを作成するためのガイドとなります。

これは成功の穴と呼ばれます。

詳細については、私のブログを参照してください

于 2013-01-03T23:27:22.390 に答える