C# .net-锁定已装箱的值而不是新对象

C# .net-锁定已装箱的值而不是新对象,c#,.net,multithreading,locking,value-type,C#,.net,Multithreading,Locking,Value Type,我最近在一个我正在从事的项目中遇到了这段代码,我不确定它应该如何运行 private static object _syncRoot = 1; public void DoSomething() { lock (_syncRoot) { // do stuff... } } 我知道使用newobject()锁是一种习惯。如果锁定在一个已装箱的整数上,该锁的行为如何?如果添加另一个具有相同值的锁,会发生什么情况 private static object

我最近在一个我正在从事的项目中遇到了这段代码,我不确定它应该如何运行

private static object _syncRoot = 1;

public void DoSomething()
{
    lock (_syncRoot)
    {
        // do stuff...
    }
}
我知道使用
newobject()
锁是一种习惯。如果锁定在一个已装箱的整数上,该锁的行为如何?如果添加另一个具有相同值的锁,会发生什么情况

private static object _anotherLock = 1;

public void DoSomethingElse()
{
    lock (_anotherLock)
    {
        // do stuff...
    }
}

第二个值将被装箱到另一个对象中。锁将彼此完全独立,因为它们引用两个不同的对象。

lock
始终使用引用相等


两个不同的装箱
1
s给出两个不同的锁。

虽然与装箱没有直接关系,但如果使用像“1”这样的字符串而不是int,这可能会中断。具有相同常量值的两个字符串可以具有相同的引用,因此锁定“单独”字符串将使用相同的同步块。一般来说,我建议使用new object()[一个已知的好模式]而不是像这样的常量


事实上,我不确定装箱到唯一实例是否真的在规范中。我肯定可以看到为公共常量(如0或1)创建一个“装箱池”作为潜在的CLR改进。如果实现了这一点,这种用法将失败(很可能是以一种非常恶劣和不可预测的方式)。

这将不会锁定
1
,因此简而言之,装箱对象将不同,这些锁定也将不同

ValueType无法锁定是有原因的