【发布时间】:2023-03-12 20:22:01
【问题描述】:
我有一个函数,它根据键(名称)返回字典中的条目,如果它不存在,则返回一个新创建的条目。
我的问题是“双锁”:SomeFunction 锁定 _dictionary,检查密钥是否存在,然后调用一个也锁定同一个字典的函数,它似乎有效,但我不确定是否这种方法存在潜在问题。
public Machine SomeFunction(string name)
{
lock (_dictionary)
{
if (!_dictionary.ContainsKey(name))
return CreateMachine(name);
return _dictionary[name];
}
}
private Machine CreateMachine(string name)
{
MachineSetup ms = new Machine(name);
lock(_dictionary)
{
_ictionary.Add(name, ms);
}
return vm;
}
【问题讨论】:
-
我认为您误解了锁定的作用。锁定阻止所有其他线程访问受保护的代码区域。它对 current 线程没有任何作用。你可以在同一个线程上对同一个对象取出一千次锁,没问题;因此锁定的每个代码区域都将受到保护,不会被其他线程访问。
-
如果您正在寻找“同线程锁”,请查看 Semaphore 类。
标签: c# multithreading