如何
让我说我有这个课程
@ImmutableWannabe
public class ConfigurationHolder {
@ImmutableButHowToMakeSureNoTwoThreadsOverrideOneEachOtherWhenReplacingReference
private Map<System, Configuration> mySysConfig = ImmutableMap.builder<>getSomeConfigurations....build();
ConfigurationHolder(copy constructor) {
mySysConfig = ImmutableMap.builder().of(inputSysConfig);
}
}
现在让我们说其中一个系统配置已经更新,我需要更新这个地图,但是我需要以线程安全的方式来完成。这意味着如果两个线程尝试更新相同系统的相同配置,则数据应该是一致的,并且它们不应该互相覆盖。
不变性如何帮助我?据我所知,我仍然需要锁定,如果是,如何正确地做?
所以我的一般问题是:是不是因为任何可以改变系统时间的immutableObject都会导致我们需要锁定需要更改其ImmutableObjectHolder的代码?我不明白......
有人可以为那个Map +正确的“客户端”代码提供一个ImmutableMap + Holder的正确示例,该代码知道如何通过更新内部Map来更新这个ImmutableMapHolder吗?
感谢
答案 0 :(得分:1)
假设你的地图是一个实例变量,最简单的方法是volatile
。或者,为它制作一个getter和setter并使它们成为synchronized
。即,使用标准技术。请注意,如果客户端试图变得聪明并将值缓存在局部变量中,这将无济于事。 (我曾经多次咬过这个错误。)
我想作为替代方案,你可以设置一些MyImmutableChanged事件/监听器。
并且,你是对的,不变性并不能解决每个线程问题。