spu*_*rra 3 c# locking object thread-safety
请考虑以下代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
如果线程A获得锁定2,并且线程B尝试获得锁定1,那么B是否会获得锁定?考虑两个锁使用相同的锁定对象.
不,线程B需要等到线程A释放锁.这就是它是同一个锁对象,毕竟 - 有一个锁.获取或释放锁的地方无关紧要:一次只有一个线程可以"拥有"监视器.
顺便提一下,我强烈建议你使用大括号来提高可读性:
lock(_list)
{
_list.Add(...);
}
Run Code Online (Sandbox Code Playgroud)