我知道我必须锁定一个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;
答案 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);
}