// ================================================================================================
//
// ロック用のオブジェクトを提供するクラスソース
//
//
// 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
}
}