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

private static object _syncRoot = 1;

public void DoSomething()
{
    lock (_syncRoot)
    {
        // do stuff...
    }
}

我知道习惯上使用 new object() 作为你的锁。这个锁将如何被锁定在一个装箱整数上?如果添加另一个具有相同值的锁会发生什么?
private static object _anotherLock = 1;

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

最佳答案

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

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

关于c# - .net - 锁定装箱值而不是新对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8219691/

10-12 23:15