Skip to main content
 首页 » 编程设计

c#之在 C# 中一起锁定 2 个对象

2024年01月28日32shihaiming

有什么方法可以同时锁定 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; 
        } 
    } 
}