80

.NET 4.5 には新しい名前空間System.Collections.Immutableがあります

このパッケージは、不変コレクションとも呼ばれる、スレッド セーフで内容が決して変更されないことが保証されているコレクションを提供します。

よくわかりません。スレッド セーフの問題は、 ReadOnlyCollectionクラスによって既に解決されているのではないでしょうか。代わりにImmutableListを使用する理由


IReadOnlyListインターフェイスもあると思います。他のスレッドが別のインターフェイスでオブジェクトを編集する可能性があるため、これはスレッド セーフの問題を暗黙のうちに解決するわけではありません。

4

4 に答える 4

5

マルチスレッドのシナリオでは、読み取り専用コレクションは依然としてスレッドセーフではないことに注意してください。

ReadOnlyCollection<T>ドキュメントから:

... 基礎となるコレクションに変更が加えられると、読み取り専用コレクションにそれらの変更が反映されます

などのコレクションList<T>はスレッド セーフではないため、読み取り専用コレクションもスレッド セーフではありません。

重要: MSDN で明示的に説明されていない特殊なケースがいくつかあります。コレクションのコンテンツを読み取るだけに見えるいくつかの操作は、実際にはコレクションの内部構造を変更しています。なぜこれが特定されていないのですか?- 明らかな理由の 1 つは、それが API に反映されていない実装の詳細であるためです。その結果、List<T>ラップされた を に変更せずReadOnlyCollection<T>に getter のみを使用した場合でも、マルチスレッド環境でクラッシュが発生する可能性があります。

要するに、一般的なコレクションは、ReadOnlyCollectionそのままではマルチスレッド環境で使用できないということです。

とは対照的にReadOnlyCollection、不変コレクションは、コレクションへの参照が取得された後に内部構造が変更されないことを保証します。これらの構造は真に不変ではないことに注意してください。代わりに、それらはfreezableです。つまり、構造体は、凍結されて呼び出し元に返されるまで、しばらくの間内部的に変更されます。その時点を超えると、不変コレクションに対する他のすべての呼び出しは、元の参照を通じてアクセス可能な構造の外部でのみ変更を行います。

結論: 読み取り専用コレクションはスレッドセーフではありません。不変コレクションはスレッドセーフです。

于 2018-03-02T10:20:28.260 に答える