我需要在我们的框架中实现应该执行锁定机制的类。我们有几个线程,它们的编号为 0,1,2,3.... 我们有一个名为 的静态类ResourceHandler
,它应该将这些线程锁定在给定的对象上。要求是 nLock()
调用应由 mRelease()
调用实现,其中 n = [0..] 和 m = [0..]。因此,无论对单个对象执行多少锁,只需一次Release()
调用就足以解锁所有对象。更进一步,如果 o 对象没有被锁定,Release()
调用应该什么也不做。我们还需要知道哪些对象被锁定在哪些线程上。
我有这个实现:
public class ResourceHandler
{
private readonly Dictionary<int, List<object>> _locks = new Dictionary<int, List<object>>();
public static ResourceHandler Instance {/* Singleton */}
public virtual void Lock(int threadNumber, object obj)
{
Monitor.Enter(obj);
if (!_locks.ContainsKey(threadNumber)) {_locks.Add(new List<object>());}
_locks[threadNumber].Add(obj);
}
public virtual void Release(int threadNumber, object obj)
{
// Check whether we have threadN in _lock and skip if not
var count = _locks[threadNumber].Count(x => x == obj);
_locks[threadNumber].RemoveAll(x => x == obj);
for (int i=0; i<count; i++)
{
Monitor.Exit(obj);
}
}
// .....
}
实际上我在这里担心的是线程安全。我实际上不确定,它是否是线程安全的,修复它真的很痛苦。我是否正确地完成了任务,如何确保这是线程安全的?