gpt4 book ai didi

c# - 在多个集合中使用同一个锁对象是线程安全的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:25 25 4
gpt4 key购买 nike

我知道我必须锁定哈希集以使其在多线程内部工作时线程安全,但我不太明白的是如果您有多个哈希集怎么办?可以使用同一个锁对象吗?或者您需要一个单独的对象吗?

例如...我有这 2 个方法,它们使用相同的对象。

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;

最佳答案

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

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);
}

关于c# - 在多个集合中使用同一个锁对象是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46971667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com