c# - 关于 C# 中的锁定对象

标签 c# object thread-safety locking

考虑以下代码:

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/

相关文章:

C++:是否使用 IIFE 线程安全初始化静态局部变量?

c# - 如何在 Restful 响应中保持区分大小写?

c# - 在 C# 中将双色 TIFF 转换为双色 PNG

c# - 如何在开机时启动后台任务 - Windows 应用商店应用

c++ - 将对象添加到命名空间 C++

java - 为什么在syncedList()或Vector已经同步的情况下,为什么我们仍然需要外部同步?

c# - 我可以在方法调用中强制自己短路吗?

javascript - 引用 Javascript 对象中的键

javascript - 删除数组中所有重复项和未定义项。 Ramda.js

c - 使用条件变量的简单多线程堆栈实现