锁定指定对象和锁定辅助对象有什么区别?

Ben*_*ter 1 .net c#

最近我的一位朋友问我是刚刚开始玩线程的,主要是为了锁定或只是锁定你引用的对象,使用辅助对象之间的区别是什么.我不得不承认我不知道,谁能告诉我?我将尝试使用几个代码片段进行演示:

第一种方法:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种方法:

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

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

是否存在重大差异,还是归结为个人编码风格?如果存在显着差异,有人可以解释它是什么吗?

我确实遇到了另一个问题[ 锁定(锁定器)和锁定(variable_which_I_am_using)之间的区别 ],其中答案暗示这两者都是等效的,但如果是这样的话,那将是最好用的,为什么?

我已经看到一些散布在网络上的例子,我倾向于使用第一种方法作为个人选择的问题,但我想知道使用第二种方法的优点是什么.

Mar*_*ell 5

最大的区别在于,只有你的代码知道的辅助对象不会有来自其他代码(不是你的代码)的意外后果(死锁,脉冲/等待陷阱等)的锁定主要对象(通常可用于其他代码).

IMO,也许CLR团队会以明确的Lock类型做得更好- 或者可能Monitor应该是非静态的等等.