/// <summary> /// /// </summary> /// <param name="obj"></param> internal static void Enter(Object obj) { MonitorEx monitor = get(obj); if (monitor == null) { monitor = add(obj); } monitor.Enter(); }
private static readonly object _lockObject = new object(); // for a local monitor, to supervise monitor list access /// <summary> /// /// </summary> /// <param name="value"></param> /// <returns></returns> private static MonitorEx add(Object value) { if (value == null) { throw new ArgumentNullException(); } lock (_lockObject) { MonitorEx localMonitor; // verify monitor was not just added by another thread if (!_monitorTable.TryGetValue(value, out localMonitor)) { // Add the new monitor - create the new arrays, copy old data, assign to members and assign data localMonitor = new MonitorEx(); _monitorTable.Add(value, localMonitor); } return(localMonitor); } }