ConcurrentDictionaryの使い方の詳細説明 マルチスレッド同期辞書収集例

零下一度
リリース: 2017-06-24 09:48:24
オリジナル
14284 人が閲覧しました

これまで、私の基本クラスのほとんどは、マルチスレッドでのキャッシュ競合を処理するためにロックとハッシュテーブルの組み合わせを使用していましたが、これら 2 つの組み合わせを使用すると、コレクションが追加されたという例外が発生することがありました。コードを複数回処理しても問題は変わりませんでしたが、最終的に、.NET 4.0 以降に導入された ConcurrentDictionary マルチスレッド同期辞書コレクションが使用され、問題は正常に解決されました。

1. ロックと Hashtable の組み合わせを使用して、基本クラスでビジネス オブジェクトを構築します。通常、BLLFactory.Instance を使用して、対応するビジネス オブジェクトのアプリケーションを取得できます。

var result = BLLFactory<Customer>.Instance.FindFirst();
Console.WriteLine(result.ToJson());
ログイン後にコピー
そこで、BLLFactory.Instance を使用してオブジェクトを構築した後、それらを HashTable に配置します。マルチスレッドの競合処理を設計する必要があるため、ロック オブジェクトを使用してロック処理を実装する必要があります。

HashTable は、キーと値のペアのコレクションを表します。 .NET Framework では、Hashtable は System.Collections 名前空間によって提供されるコンテナーであり、キーと値のペアを処理および表現するために使用されます。キーは値の大文字と小文字を区別します。キーに対応する値を格納するために使用されます。 Hashtable のキーと値のペアはすべてオブジェクト型であるため、Hashtable はあらゆる種類のキーと値のペアをサポートでき、null 以外の任意のオブジェクトをキーまたは値として使用できます。

この方法を使用しても、Web 側でマルチスレッド アクセスの競合が発生することがあります。このため、マルチスレッド テスト コードを使用してエラーをテストし、再現することもできます。トラッキングコードは以下の通りです。

したがって、上記のコードからわかるように、lock(syncRoot)を使用してもマルチスレッド競合の問題は発生しません。

2. Hashtable の代わりに ConcurrentDictionary を使用する

ConcurrentDictionary は、.net4.0 によって起動されたスレッドセーフなコレクションの 1 つで、ConcurrentStack、ConcurrentQueue、およびそれらのシングルスレッド バージョンも同時にリリースされています。スレッドアンセーフ (キュー、スタック、ディクショナリ) についてはよく知っているでしょう。 ConcurrentDictionary<

TKey,

は複数のスレッドから同時にアクセスでき、スレッドセーフです。ただし、いくつかのメソッドが追加されています。 ConcurrentDictionary は System.Collections.Concurrent 名前空間に属します。

System.Collections.Concurrent 名前空間は、複数のスレッドセーフなコレクション クラスを提供します。複数のスレッドがコレクションに同時にアクセスする場合、System.Collections および System.Collections.Generic 名前空間

の対応する型の代わりに、これらのクラスを使用する必要があります。 ConcurrentDictionary このクラスは、コレクションを処理するための次のメソッドを提供します

            try{
                List<Thread> list = new List<Thread>();for (int i = 0; i < 10; i++)
                {
                    Thread thread = new Thread(() =>{var result = BLLFactory<Customer>.Instance.FindFirst();
                        Console.WriteLine(result.ToJson());
                        Console.WriteLine();
                    });

                    list.Add(thread);
                }for (int i = 0; i < list.Count; i++)
                {
                    list[i].Start();
                }
            }catch(Exception ex)
            {
                LogTextHelper.Error(ex);
            }
ログイン後にコピー
ConcurrentDictionaryを使用してHashtableを置き換えます。以下に示すBLLFactoryクラスの実装コードを見てみましょう。

public bool TryAdd(TKey key, TValue value)public bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue)public TValue this[TKey key] { get; set; }public TValue AddOrUpdate(TKey key, Func addValueFactory, Func updateValueFactory)    
public TValue AddOrUpdate(TKey key, TValue addValue, Func updateValueFactory)public TValue GetOrAdd(TKey key, TValue value)public TValue GetOrAdd(TKey key, Func valueFactory)

コードが大幅に簡略化されており、以前のマルチスレッド テスト コードを使用すると、例外なくスムーズにデータを取得できることがわかります。

実行中のコードはスムーズに実装でき、Hashtable を使用する前に発生していたマルチスレッド アクセス例外は発生しません。

以上、マルチスレッドオブジェクトキャッシュ用の Hashtable に代わる ConcurrentDictionary の紹介でしたが、問題がスムーズに解決できれば、以前よりもアクセス効率も向上したことが分かり一石二鳥です。 。

以上がConcurrentDictionaryの使い方の詳細説明 マルチスレッド同期辞書収集例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート