// ================================================================================================ // // ロック用のオブジェクトを提供するクラスソース // // // Copyright (C) 2012 Honeplus. All rights reserved. // // Honeplus // ================================================================================================ namespace Honememo.Utilities { using System; using System.Collections.Concurrent; using System.Collections.Generic; /// /// ロック用のオブジェクトを提供するクラスです。 /// /// このクラスはスレッドセーフです。 public class LockObject { #region private変数 /// /// ハッシュに対応するロックオブジェクト。 /// private IDictionary locks = new ConcurrentDictionary(); #endregion #region パラメータ単位のロック用メソッド /// /// パラメータのハッシュに対応するロックオブジェクトを返す。 /// /// ロックの単位となるパラメータ。 /// 対応するロックオブジェクト。 /// null /// /// パラメータのハッシュ取得にはを使用する。 /// public object GetObject(object param) { // ロックオブジェクトを取得、この時点では特にロック不要 // ※ ConcurrentDictionaryを使用しており、一回の処理で更新しているため int hashcode = Validate.NotNull(param, "param").GetHashCode(); object lockObject; if (this.locks.TryGetValue(hashcode, out lockObject)) { return lockObject; } // 存在しない場合、ロックを行い念のためキャッシュを再確認 lock (this.locks) { if (this.locks.TryGetValue(hashcode, out lockObject)) { return lockObject; } // それでも無ければ、ハッシュに対応するロックオブジェクトを作成して返す lockObject = new object(); this.locks[hashcode] = lockObject; } return lockObject; } #endregion } }