-2

如何

假设我有这门课

@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 吗?

谢谢

4

1 回答 1

1

假设你的地图是一些实例变量,它是最简单的方法volatile。或者,为它制作一个 getter 和 setter 并制作它们synchronized。即,使用标准技术。请注意,如果客户端试图聪明并将值缓存在局部变量中,这将无济于事。(我已经被这个虫子咬过几次了。)

我想作为替代方案,您可以设置一些 MyImmutableChanged 事件/侦听器。

而且,您是对的,不变性并不能解决所有线程问题。

于 2013-01-29T06:49:39.380 回答