从多个类访问未同步的映射

时间:2014-08-28 12:21:00

标签: java multithreading synchronization

这个问题出于好奇,我有三个课程ABC

  • class A有一个成员变量Map sharedMap
  • B级和C级正在访问A类sharedMap并尝试根据需要更改地图的值。

问题是 - 我无法更改课程A中的任何内容,因为我无法控制课程A(无法使用synchronize关键字或方法来同步地图)是否有任何内容仍然管理班级A sharedMap

的同步的方法

1 个答案:

答案 0 :(得分:1)

使用合成 - 而不是创建A的实例,只需将其包装在其他类中,并使用synchronized方法公开地图。如果A正在实现某些接口,那么该包装类也应该实现它们并且只是将所有调用委托给A.所以基本上就像

class WrappedA implements InterfaceA {
  private A inner = new A(); // don't expose A's instances to other classes
  public synchronized void mapManipulator() {
   // do something with inner.map
  }
  @Override
  public void interfaceMethodA() {
   // IF any of those methods are using the map, remember to synchronize
   inner.interfaceMethodA();
  }
}

因为这是你的代码,你可以做出这样的改变。如果你不能做到这一点(其他东西正在创建A?)那么A将始终暴露给其他类,所以你必须制定一个约定,所有其他类将通过一些新类调用它但这将是非常错误如果有人忘记使用包装而不是A。

有关上下文的任何更多细节可能有助于提出更好的内容......