6

System.Collections.Queueクラスには、スレッドセーフなキューインプリメンテーションを返すメソッドQueue.Synchronizedがあります。なぜCollections.Generic.Queueには同期メソッドがありますが、Collections.Queueにはありますか?

しかし、一般的なもの、System.Collections.Generic.QueueSynchronizedメソッドを持っていません。この時点で私は2つの質問を念頭に置いています:

  1. なぜこの方法は一般的ではありませんか?それはフレームワークAPI設計の決定ですか?キューがQueue.Synchronizedから返されるどのよう
  2. ConcurrentQueue<T>クラスよりも違うのですか?

ありがとうございます。

答えて

13

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

ほとんどの実際の使用パターンは、同期のコレクションのために利益を得ません。彼らは依然としてより高いレベルの操作のまわりでロックを必要とします。

したがって、のSynchronized()のメソッドは、実際にはスレッドセーフではないコードを書く人々を導くトラップです。


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

同時コレクションパッケージには、マルチスレッド環境で(例えば、TryDequeue())を使用しても意味がメソッドが含まれています。実際にスレッドセーフなコードを記述するのに役立ちます。

これはpit of successと呼ばれています。より多くの情報については

、あなたは上記の私の最初の質問に答えることができる場合、私は本当に感謝しmy blog

+0

を参照してください。ありがとう! –

+0

@ahmetalpbalkan:この方法は役に立たないよりも悪いので。 – SLaks

関連する問題