第9章 コレクション コレクション
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
適切なコレクションを使うことは、並行アプリケーションでは不可欠である。List<T> のような標準的なコレクションについて話しているのではない。この章の目的は、特に並行または非同期の使用を目的とした新しいコレクションを紹介することである。
不変性コレクションとは、、決して変化しないコレクションインスタンスのことである。一見、これは全く役に立たないように聞こえるが、実際にはシングルスレッドで非同期のアプリケーションでも非常に便利である。読み取り専用の演算子(列挙など)は不変性インスタンスに直接作用する。書き込み演算子(項目の追加など)は、既存のインスタンスを変更する代わりに新しいイミュータブル・インスタンスを返す。ほとんどの場合、不変性コレクションはメモリのほとんどを共有するため、これは最初に聞こえるほど無駄ではない。さらに、不変性コレクションは複数のスレッドからアクセスしても暗黙的に安全であるという利点がある。
チップ
不変性 コレクションは System.Collections.ImmutableNuGetパッケージにある。
不変性コレクションは新しいものだが、可変性インスタンスが必要でない限り、新規開発では考慮すべきだ。もし不変性コレクションに馴染みがないのであれば、スタックやキューが必要ないとしても、レシピ9.1から始めることをお勧めする。
既存の要素がたくさんある不変性コレクションをより効率的に構築する特殊化方法がある。これらのレシピのサンプルコードでは、要素を1つずつ追加するだけである。MSDNドキュメントには、初期化を高速化する必要がある場合に、不変性コレクションを効率的に構築する方法の詳細が記載されている。
- スレッドセーフ・コレクション
-
これらのミュータブル・コレクション・インスタンスは、複数のスレッドによって同時に変更することができる。スレッドセーフコレクションは、スレッドが最小限の時間だけブロックされる(通常はまったくブロックされない)ことを保証するために、きめ細かいロックとロックフリーのテクニックを組み合わせて使用する。多くのスレッドセーフ・コレクションでは、コレクションの列挙によってコレクションのスナップショットが作成され、そのスナップショットが列挙される。スレッドセーフ・コレクションの主な利点は、複数のスレッドから安全にアクセスでき、しかも乗算演算子がコードをブロックする時間が短いことである。
- プロデューサ/コンシューマ・コレクション
-
これらのミュータブル・コレクション・インスタンスは、特定の目的を念頭に設計されている。(おそらく複数の)プロデューサがコレクションにアイテムをプッシュできるようにする一方で、(おそらく複数の)コンシューマがコレクションからアイテムを引き出せるようにするためである。つまり、プロデューサ・コードとコンシューマ・コードの橋渡しとして機能し、コレクション内のアイテム数を制限するオプションもある。プロデューサ/コンシューマ・コレクションは、ブロッキングまたは非同期のAPIを持つことができる。例えば、コレクションが空の場合、ブロッキング・プロデューサ/コンシューマ・コレクションは、別のアイテムが追加されるまで、呼び出し元のコンシューマ・スレッドをブロックする。一方、非同期プロデューサ/コンシューマ・コレクションは、別のアイテムが追加されるまで、呼び出し元のコンシューマ・スレッドを非同期で待機させる。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access