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无法锁定是有原因的