跨多个集合使用相同的锁对象是否是线程安全的?

时间:2017-10-27 09:21:43

标签: c# .net multithreading

我知道我必须锁定一个hashset,以便在多个线程内部工作时使其线程安全,我真正理解的是如果你有多个hashsets会怎样?你能使用相同的锁对象吗?或者你需要一个单独的对象?

例如......我有这两种使用相同对象的方法。

private void RemoveSheduledAttack(Attack attack)
{
    lock (_syncRoot)
    {
        _sheduledAttacks.Remove(attack);
    }
}

private void AddActiveAttack(Attack attack)
{
    lock (_syncRoot)
    {
        ActiveAttacks.Add(attack);
    }
}

声明:

private readonly HashSet<Attack> _sheduledAttacks;
private static object _syncRoot = new object();
public HashSet<Attack> ActiveAttacks;

1 个答案:

答案 0 :(得分:0)

不完全是您的问题的答案,但希望建议使用并发集合的现有实现。

HashSet<T>没有并发实施,但您可以使用ConcurrentDictionary<TKey, TValue>,那么您的代码就会变得更加清晰,无需维护锁定对象

private ConcurrentDictionary<Attack, bool> _sheduledAttacks;
private ConcurrentDictionary<Attack, bool> _activeAttacks;

private void RemoveSheduledAttack(Attack attack)
{
    var dummyValue = false
    _sheduledAttacks.TryRemove(attack, out dummyValue);
}

private void AddActiveAttack(Attack attack)
{
    _activeAttacks.TryAdd(attack, false);
}