在java中如何替换不可变对象

时间:2013-01-29 06:31:30

标签: java multithreading concurrency immutability

如何

让我说我有这个课程

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

感谢

1 个答案:

答案 0 :(得分:1)

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

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

并且,你是对的,不变性并不能解决每个线程问题。