关于C#中的锁定对象

请考虑以下代码:

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#中的锁定对象 - 代码日志