我可以像我在当前代码中描述的那样使用它吗?
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);
}
}
答案 0 :(得分:3)
Interlocked
类时,不需要锁定。
MSDN说,增加指定变量并将结果存储为原子操作。
答案 1 :(得分:3)
是的,你可以,但没有理由这样做。 lock
和interlocked
操作只有在所有相关方同意的情况下才有效。如果一个线程使用lock
,期望在持有锁时没有任何变化,而另一个线程使用ICX
,那么ICX线程刚刚违反了第一个线程的假设。如果两个线程同意使用lock
,那么在lock
内使用ICX是值得怀疑的。单一陈述lock
所有这一切都是ICX非常不寻常。
您需要发布更详细的代码说明,解释您尝试解决的实际问题。
答案 2 :(得分:1)
你可以使用它,但在这种情况下是冗余,因为lock
阻止了其他任何内容。
请查看this post了解详情。
---编辑---
好的,我看到您编辑了问题,以便向lock
块添加内容。
在这种情况下,保护其他操作是有意义的,但 是否有意义将Interlocked.Increment
置于lock
块中取决于您正在尝试完成。
你能提供更多背景吗?