假设一个服务器存储了一个连接数据的 ImmutableHashSet
ImmutableHashSet<ConnectionData> connections = new ...
然后我有各种调用添加/删除/读取,即:
OnConnected(connectionData) => connections = connections.Add(connectionData);
OnDisconnected(connectionData) => connections = connections.Remove(connectionData);
我的问题是,在上述仅对 HashSet(添加/删除)执行单个操作的调用中,我应该锁定连接吗?或者 ImmutableHashSet 操作线程安全吗?
最佳答案
您将值直接分配回集合的模式不是线程安全的。但是,在使用不可变集合时,您通常不希望 lock
。这些集合的主要特性之一是无锁操作,它通常性能更高。相反,使用 ImmutableInterlocked
类:
ImmutableHashSet<ConnectionData> connections;
ImmutableInterlocked.Update(ref connections,
(collection, item) => collection.Add(item),
connectionData);
ImmutableInterlocked.Update(ref connections,
(collection, item) => collection.Remove(item),
connectionData);
关于C# 不可变 HashSet 锁定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51434624/