6

System.Collections.Queue類有Queue.Synchronized方法返回一個線程安全的隊列實現。爲什麼Collections.Generic.Queue沒有Synchronized方法,但Collections.Queue有?

但是通用的System.Collections.Generic.Queue沒有Synchronized方法。在這一點上,我有兩個問題:

  1. 爲什麼不通用的人有這種方法?它是一個框架API設計決定嗎?
  2. Queue.Synchronized返回的隊列與ConcurrentQueue<T>類有什麼不同?

謝謝。

回答

13

Synchronized()方法返回一個包裝隊列,爲每個方法添加一個鎖。
編寫多線程應用程序時,此模式實際上並不實用。

大多數真實世界的使用模式不會爲同步集合帶來好處;他們仍然需要鎖定更高級別的操作。

因此,System.Collections中的Synchronized()方法實際上是一個讓人們編寫非線程安全代碼的陷阱。


ConcurrentQueue<T>類是專門爲併發的應用程序設計的,並含有有用的方法的是原子修改隊列。

併發收集包只包含在多線程環境中使用的方法(例如,TryDequeue());他們將幫助指導您編寫實際上是線程安全的代碼。

這被稱爲pit of success

有關更多信息,請參閱my blog

+0

我會很感激,如果你能回答我的第一個問題上面。謝謝! –

+0

@ahmetalpbalkan:因爲這種方法比無用的更糟糕。 – SLaks

相關問題