有什么方法可以同时锁定 2 个不同的对象? 我尝试使用 lock(obj1, obj2){...} 但出现此错误:
invalid expression term ','
更新: 正如许多用户告诉我尝试只使用一个锁一样,我很欣赏他们的建议,因为大多数时候它更可取,我只想展示一个我认为对 2 个对象使用锁更合理的案例。 考虑在不同线程之间共享 2 个队列的情况。您需要避免同时执行 Enqueue(item) 和 Dequeue()。现在,在代码的特定部分,您想要从一个队列中获取一个元素并将其插入到第二个队列中。我知道可以这样做:
var itme;
lock(_lock1)
{
item = q1.Dequeue();
Monitor.Pulse(_lock1);
}
lock(_lock2)
{
q2.Enqueue(item);
Monitor.Pulse(_lock2);
}
但我认为同时锁定 _lock1 和 _lock2 更具可读性和简洁性。
请您参考如下方法:
我强烈建议您使用一个锁来避免死锁,并且您应该锁定一个单独的引用,而不是您要修改的对象。
class MyClass
{
private readonly object _lock = new object();
private readonly List<int> _myList = new List<int>();
private int _index;
public void MyOperation()
{
lock(_lock)
{
_index++;
}
}
public void MyOperation2()
{
lock(_lock)
{
_myList[_index] = 27;
}
}
}
