【问题标题】:Synchronization over objects in a dictionary字典中对象的同步
【发布时间】:2014-03-10 15:05:47
【问题描述】:

我有一个用 C# 维护的字典,其中有一个到类对象映射的字符串。

public class parent
{          
    public Dictionary<string, valueclass> clientToFileSystemMap {get;set;}
}

class valueclass
{
    //some internal state

    valueclass createclone()
    {
        create clone of this object and return
    }

    void update()
    {
        change state 
    }
}

现在可以有多个线程同时更新和克隆同一个对象。我想同步访问,以便克隆不会返回半更新的对象。

我发现的一种方法是在类 valueclass 中创建一个私有锁对象,并在该操作之前获取该锁。另一种选择是使用这里提到的[MethodImpl(MethodImplOptions.Synchronized)] - C# version of java's synchronized keyword?。 另一种选择可能是创建一个类似于类对象的对象字典并锁定它们。

最好的方法是什么?

【问题讨论】:

  • 您能否发布更具体的代码(在您粘贴的代码中,没有您提到的字典)以获得更好的答案?
  • 完成。虽然字典在这里并不重要。

标签: c# multithreading dictionary sync


【解决方案1】:

您可以使用 ConcurrentDictionary 来控制对字典元素的访问 - 但如果听起来您需要每个对象的私有锁 - 因为一旦线程有引用 - 字典并不是真正的问题。

private object privateLock = new object();

void update(){
    lock(privateLock)
    {
        //change state 
    }
}

valueclass createclone(){
    lock(privateLock)
    {
        //Clone 
    }
}

【讨论】:

  • 谢谢。是的,这似乎是正确的选择。顺便说一句,为什么这种方法比使用 [MethodImpl(MethodImplOptions.Synchronized)] 更受青睐有一个特定的原因吗?
  • 嗯 - 你实际上需要使用相同的锁,不同的方法 - 所以,我建议锁定一个对象。
  • [MethodImpl(MethodImplOptions.Synchronized)] 是否对该对象进行了锁定?
  • @piyush 同步标志告诉编译器确保一次只有一个线程在函数中。它不会阻止两个踏板同时在克隆第二个更新。听起来您需要确保两个函数之间发生同步。
  • 据我了解 [MethodImpl(MethodImplOptions.Synchronized)] 会锁定这个。如果我将 [MethodImpl(MethodImplOptions.Synchronized)] 添加到这两个方法中,那么对它们的访问就会同步对吗?
【解决方案2】:

也可以使用ICollection接口提供的SyncRoot

http://msdn.microsoft.com/en-us/library/bb348148(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2010-11-21
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多