关于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#-从字典获取资源时锁定资源


下一篇:java-锁定获取顺序