c# - c# Immutability 创建全局存储
问题描述
对于我的项目,我正在尝试创建一个全局存储来服务于这样的可变状态:
// Immutable program state
sealed public class State : IEquatable<State> {
public State(ClientsConnections clientsConnections, ImmutableList<string> ids) {
this.ClientsConnections = clientsConnections;
this.Ids = ids;
}
public readonly ClientsConnections ClientsConnections; // ClientsConnections is immutable
public readonly ImmutableList<string> Ids; // also immutable
public override int GetHashCode() => HashCode.Combine(AgentsConnections.GetHashCode(), Ids.GetHashCode());
public override bool Equals(object obj) { var o = obj as State; return o is null ? false : ClientsConnections.Equals(o.ClientsConnections) && Ids.Equals(Ids); }
public bool Equals(State o) => object.Equals(this, o);
public static bool operator ==(State o1, State o2) => object.Equals(o1, o2);
public static bool operator !=(State o1, State o2) => !object.Equals(o1, o2);
}
// Store is a mutable singleton
sealed public class Store {
readonly object stateLock = new object();
public Store() => this.State = new State(new ClientsConnections(), ImmutableList<string>.Empty);
public State State { get; private set; }
public void SetState(Func<State, State> f) { lock (stateLock) State = f(State); }
}
然后我在这样的代码中使用它:
Thread1 - f1() {
var currState=Store.State;
log(currState.ids);
}
Thread2 - f2() {
Store.SetState(currState => {
var newids = currState.Ids.Add("hello");
return new State(currState.ClientsConnections, newids);
});
}
问题:
这个代码线程安全吗?特别是我需要锁定 Store.State getter 吗?我的理由是,由于 getter 执行了按值复制状态引用的原子分配,那么我不需要在这里锁定它吗?
我可以/应该在这里使用 ImmutableInterlocked 吗?
解决方案
这个代码线程安全吗?特别是我需要锁定 Store.State getter 吗?我的理由是,由于 getter 执行了按值复制状态引用的原子分配,那么我不需要在这里锁定它吗?
只要您对陈旧的数据感到满意,是的,它会正常工作。
我可以/应该在这里使用 ImmutableInterlocked 吗?
是的,我认为你应该(但你应该配置文件以确认它是否真的提供了好处)。ImmutableInterlocked.Update
是我的建议。
推荐阅读
- javascript - javascript 可以保存对 C++ 库的对象引用吗?
- c# - 将新项目添加到表单中的嵌套列表
- java - 给定一个 jooq 查询如何找到所涉及的表?
- javascript - 赛普拉斯如何在对象数组中查找对象
- javascript - 将svg动态插入html
- android - Android Studio - 找不到 com.firebase:firebase-jobdispatcher:0.8.5
- javascript - 使用microsoft graph api上传文件到onedrive时的授权
- azure - 天蓝色管道模板在 targetType:filePath 时找不到脚本
- apache - Apache 无法识别域 - Spring App
- json - 如何将此 JSON 数据导入 postgresql 表?