c# - 锁定指定对象和锁定次要对象有什么区别?

标签 c# .net

最近我的一个 friend 问我,他刚开始玩线程,使用次要对象纯粹为了锁定目的或只是锁定您引用的对象之间有什么区别。我不得不承认我不知道,谁能告诉我?我将尝试使用几个代码片段进行演示:

第一种方法:

List<string> data = new List<string>();
object datalock = new object();

void main()
{
    lock(datalock)
    {
        if (data.contains("SomeSearchString"))
        {
            //Do something with the data and then remove it
        }
    }
}

第二种方法:

List<string> data = new List<string>();

void main()
{
    lock(data)
    {
        if (data.contains("SomeSearchString"))
        {
            //Do something with the data and then remove it
        }
    }
}

是否存在显着差异或者这取决于个人编码风格?如果存在显着差异,谁能解释它是什么?

我确实遇到了另一个问题[ Difference between lock(locker) and lock(variable_which_I_am_using) ] 其中的答案暗示这两者是等效的,但如果是这样的话,最好使用哪个,为什么?

我在网上看到了很多例子,我倾向于使用第一种方法作为个人选择,但我想知道使用第二种方法的优点是什么。

最佳答案

最大的不同在于,使用次要对象只有您的代码知道,不会有来自其他 代码(不是你的)锁定主要对象(其他代码通常可用)。

IMO,也许 CLR 团队使用显式 Lock 类型会做得更好 - 或者 Monitor 应该是非静态的,等等。

关于c# - 锁定指定对象和锁定次要对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/795489/

相关文章:

c# - 如何根据托管 Url 在 ASP.Net MVC 5 中更改主题

c# - 如何使用回调字符串到主窗体

c# - Windows 窗体应用程序,自定义控件之间如何通信?

python - CPython 和 IronPython 的功能差异

c# - 在 ListView 中禁用多选复选框功能?

c# - 插入前验证数据的最佳方法

c# - 属性(property)已由 'ListView' 注册

c# - 在表单之间传递数据

c# - 在不同的方法中使用数组

.net - ASP.Net MVC 布局页面定义了以下部分但还没有渲染