如何以不可变的方式实现缓存?

Max*_*kov 5 c# immutability

我已经阅读并听到了很多关于不变性的好东西,所以我决定在我的一个爱好项目中尝试一下.我将所有字段都声明为readonly,并使所有通常会改变对象的方法返回一个新的修改版本.

它运行良好,直到我遇到一种情况,一种方法应该通过外部协议返回有关对象的某些信息而不修改它,但同时可以通过修改内部结构来优化.特别是,这在联合查找算法中使用树路径压缩时会发生.

当用户调用时int find(int n),对象显示为未修改为局外人.它在概念上代表相同的实体,但它的内部字段被改变以优化运行时间.

我怎样才能以不可变的方式实现它?

dur*_*ill 2

简短的回答:您必须自己确保线程安全。

字段上的关键字readonly可以确保在构造包含该字段的对象后无法修改该字段。因此,您对该字段的唯一写入包含在构造函数中(或字段初始化中),并且在构造对象之前不能通过方法调用进行读取,因此readonly.

如果你想实现缓存,你就打破了只发生一次写入的假设(因为“缓存写入”可以并且将会在你读取期间发生),因此在糟糕的情况下可能会出现线程问题(假设你正在从一个文件中,两个线程可以使用相同的参数调用 find 方法,但读取不同的行,因此得到不同的结果)。您想要实现的是观察不变性。这个有关记忆的相关问题可能会帮助您得到一个优雅的答案。