考虑以下代码:
static void AddItem()
{
lock (_list)
_list.Add ("Item " + _list.Count); //Lock 1
string[] items;
lock (_list)
items = _list.ToArray(); //Lock 2
foreach (string s in items)
Console.WriteLine (s);
}
如果线程A获得锁2,而线程B试图获得锁1,那么B会不会获得锁?考虑到两个锁使用相同的锁定对象。
最佳答案
不行,线程B需要等到线程A释放锁。这就是它是同一个锁对象的意义,毕竟 - 有一个一个锁。在何处获取或释放锁是无关紧要的:一次只有一个线程可以“拥有”监视器。
顺便说一句,我强烈建议您使用大括号提高可读性:
lock(_list)
{
_list.Add(...);
}
关于c# - 关于 C# 中的锁定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11952568/