如何使用相同的ID锁定对象?

Pup*_*kin 7 c# concurrency multithreading locking

我有以下代码:

public void Update(Foo foo)
{
    lock(_locker) 
    {
        UpdateFirstPart(foo.First);
        UpdateSecondPart(foo.Second);
        UpdateThirdPart(foo.Third);
    }
} 

public class Foo 
{
    public int Id;

    public Some1 First;  

    public Some2 Second; 

    public Some3 Third; 
}
Run Code Online (Sandbox Code Playgroud)

方法Update可以在两个或多个线程中执行,我lock用来防止cuncurency问题foo.但我想只锁定那些Foo有类似的东西Id.例如,如果一个线程执行方法Update与Foo.Id = 1和另一线程执行Update与Foo.Id = 2,则lock不需要和如果两个线程执行更新与两个实例Foo具有相同的Id,lock是需要的.是否可以创建这样的锁?

Hen*_*man 2

lock(foo)当你确定的时候你就可以

  • 没有其他代码用于foo锁定
  • 引用相等(同一性)是可接受的/可用的,这不是使用Id

您无法锁定int Id.


第2部分,

唉,我使用具有相同 Id 的 Foo 的不同实例

然后你可以尝试ConcurrentDictionary<int, object>为每个 ID 存储不同的 _locker 。但这会增加一些开销,以及当您长时间运行字典时清理该字典的问题。