I need to create an structure to control dynamically locks. For example, I have 100 threads running, and each thread will "process" a "key". Sometimes two threads could be processing the same "key", and if it occurs, a dynamic lock needs to be created and used by both, to process one at a time.
I create the following structure and I would like a code review, to find possible bugs (even if it is extremely rare):
// This is the class who control to create one different lock for each key.
public class DynamicLockGenerator
{
private static Dictionary<string, object> _locksByKeys = new Dictionary<string, object>();
private static object _lock = new object();
public static objectGetLock(string key)
{
lock (_lock)
{
if (!_locksByKeys.ContainsKey(key))
_locksByKeys.Add(key, new object());
return _locksByKeys[key];
}
}
public static void RemoveLock(string key)
{
lock (_lock)
{
//This line is extremely important: One lock object can only be removed
//if no thread are using it.
if (Monitor.TryEnter(_locksByKeys[key]))
{
_locksByKeys.Remove(key);
}
}
}
}
//This is the use of the class. All threads do the same thing, but with different (or equal) keys.
object lockObj = DynamicLockGenerator.GetLock(key);
lock (lockObj)
{
//PROCESS THE KEY
}
DynamicLockGenerator.RemoveLock(key);
string.intern
ensures that you get always the same instance of the string. \$\endgroup\$