1 // ================================================================================================
3 // ロック用のオブジェクトを提供するクラスソース</summary>
5 // <copyright file="LockObject.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Utilities
14 using System.Collections.Concurrent;
15 using System.Collections.Generic;
18 /// ロック用のオブジェクトを提供するクラスです。
20 /// <remarks>このクラスはスレッドセーフです。</remarks>
21 public class LockObject
26 /// ハッシュに対応するロックオブジェクト。
28 private IDictionary<int, object> locks = new ConcurrentDictionary<int, object>();
32 #region パラメータ単位のロック用メソッド
35 /// パラメータのハッシュに対応するロックオブジェクトを返す。
37 /// <param name="param">ロックの単位となるパラメータ。</param>
38 /// <returns>対応するロックオブジェクト。</returns>
39 /// <exception cref="ArgumentNullException"><paramref name="param"/>が<c>null</c>。</exception>
41 /// パラメータのハッシュ取得には<see cref="Object.GetHashCode"/>を使用する。
43 public object GetObject(object param)
45 // ロックオブジェクトを取得、この時点では特にロック不要
46 // ※ ConcurrentDictionaryを使用しており、一回の処理で更新しているため
47 int hashcode = Validate.NotNull(param, "param").GetHashCode();
49 if (this.locks.TryGetValue(hashcode, out lockObject))
54 // 存在しない場合、ロックを行い念のためキャッシュを再確認
57 if (this.locks.TryGetValue(hashcode, out lockObject))
62 // それでも無ければ、ハッシュに対応するロックオブジェクトを作成して返す
63 lockObject = new object();
64 this.locks[hashcode] = lockObject;