c# - C# 不可变哈希集锁定
问题描述
假设服务器存储连接数据的 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# - 如何调用 IEnumerable
.Any() 方法通过 MethodInfo - javascript - 不允许加载本地资源:file:///var/mobile/Containers/Data/Application/03F63826-7849-47C3-A6DF-E1EB1113FF0A/Documents/xxx.png
- cassandra - 错误运行 nodetool decommission 时恢复数据库
- python - 如何在不设置 aws configure 的情况下使用 IAM 角色获得临时 IAM 编程访问?
- c# - 如何读取堆栈分配内存的元素计数?
- elasticsearch - 未能创建有效的 geo_shape
- pandas - Pandas 使用逻辑过滤多个模式和多个子串 和“但不是”
- image - 装饰图像不显示图像 - 颤振
- sql-server - 不允许执行存储过程
- azure-devops - NSG 的 AzureDevOps ServiceTags 可用性