【问题标题】:Can i use Interlocked.Increment inside lock statement?我可以在 lock 语句中使用 Interlocked.Increment 吗?
【发布时间】:2026-02-13 06:40:01
【问题描述】:

我可以像我在当前代码中描述的那样使用它吗?

private void Increment() {
    lock(LockObject) {      
         // edit
         // ListOfObjects.Add(someInfo);
         // new edit ---> here
         ListOfObjects.Add(new SomeInfoObject() {
             Account = Interlocked.Increment(ref result),
             // ... other properties
         }
         // Interlocked.Increment(ref result);
    }
}

【问题讨论】:

  • 是的,您可以,但在这种情况下您不应该这样做。你只是增加了额外的开销。但是,当它是锁内较大代码段的一部分时,很好。

标签: c# multithreading


【解决方案1】:

使用Interlocked 类时不需要锁定。

MSDN 说,

递增指定变量并存储结果,作为原子操作

【讨论】:

  • 这取决于锁块内是否还有其他东西以及您锁定的内容。例如,使用 Interlocker.Increment 增加与锁完全无关的东西可能是有意义的。
  • 是的,如果您在锁结构中有更多语句,那么您可以这样做。从问题的上下文来看,它不是必需的
【解决方案2】:

是的,你可以,但应该没有理由这样做。 lockinterlocked 操作只有在所有相关方都同意这样做的情况下才有效。如果一个线程使用lock,期望在持有锁时没有任何变化,而另一个线程使用ICX,那么ICX线程就违反了第一个线程的假设。如果两个线程都同意使用lock,那么在lock 中使用ICX 是有问题的。一个声明 lock 说它所做的只是一个 ICX 是非常非常不寻常的。

您需要发布更详细的代码说明,说明您要解决的实际问题。

【讨论】:

    【解决方案3】:

    可以使用它,但在这种情况下是冗余,因为lock 块没有保护其他任何东西。

    查看this post 了解更多信息。

    --- 编辑---

    好的,我看到您编辑了问题以在 lock 块中添加一些内容。

    在这种情况下,保护这个其他操作是有意义的,但是将Interlocked.Increment 放在lock 块内是否有意义取决于您要完成的工作。

    您能否提供更多背景信息?

    【讨论】:

    • 你的意思是什么上下文?
    • @IamStalker 从本质上讲,其余代码在做什么以及您要完成的最终目标是什么。
    • 只是想知道这个锁定和原子操作是否在这个上下文中使用?
    • @IamStalker 如果您只有一个线程,那么您既不需要lock 也不需要Interlocked.Increment。如果您有其他线程,请告诉我们他们在做什么。
    • @IamStalker 如果没有从多个线程调用Increment,则两者都不需要。如果是,并且它是唯一使用result 的地方,那么您不需要Interlocked.Increment(ref result)(您仍然需要lock)。否则,您需要以某种方式保护result - 可能Interlocked.Increment,或者可能是这个lock可能是一些其他lock,视情况而定...