请考虑以下代码:
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(...);
}