【发布时间】:2015-05-28 13:53:37
【问题描述】:
我有以下场景:
我正在尝试锁定一个线程,如果该线程的“自定义”ID 与已经进入锁定部分代码的那个匹配,但如果 ID 不同则不是。
我创建了一些示例代码来解释我想要的行为
class A
{
private static Dictionary<int, object> _idLocks = new Dictionary<int, object>();
private static readonly object _DictionaryLock = new object();
private int _id;
private void A (int id)
{
_id = id;
}
private object getObject()
{
lock (_DictionaryLock)
{
if (!_idLocks.ContainsKey(_id))
_idLocks.Add(_id, new object());
}
lock (_idLocks[_id])
{
if (TestObject.Exists(_id))
return TestObject(_id);
else
return CreateTestObject(_id);
}
}
}
现在这对于我扩展的内容 100% 有效,其中 id 示例 1 不会检查其对象是否已创建,而另一个 id 为 1 的线程已经忙于创建该对象。
但是拥有两个锁和一个静态字典似乎根本不是正确的方法,所以我希望有人可以向我展示一种改进的方法,仅当该线程是用相同的创建线程时才停止访问代码id 已经忙于执行锁定部分中的代码。
我正在查看 ReaderWriterLockSlim 类,但对我来说使用它并没有什么意义,因为我不希望在对象 TestObject(id) 仍在创建时被读取。
我不关心锁定线程访问字典。
我要不惜一切代价避免在CreateTestObject(_id)中使用该线程运行的_id,而已经有一个忙,因为正在使用该id创建和删除文件,如果两个线程都将引发异常试图访问相同的文件
这可以通过普通锁来修复,但在这种情况下,我仍然希望其 _id 当前未在 CreateTestObject(_id) 方法中运行的线程能够在锁中输入代码。
这都是因为 CreateTestObject 内部发生的事情需要时间,如果线程正在等待访问它,性能会受到影响。
【问题讨论】:
-
是否可以对整个
_idLocks字典进行锁定而不是使用 2 个锁定?我对锁很陌生,所以我不确定你可以将什么用作锁对象。
标签: c# multithreading locking