java - 从多个类访问未同步的 map

标签 java multithreading synchronization

这个问题是出于好奇而提出的,我有三个类 ABC

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

问题是 - 我无法更改 A 类中的任何内容,因为我无法控制 A 类(无法使用同步关键字或方法来同步 map ) )有什么办法仍然可以管理类 AsharedMap 的同步吗?

最佳答案

使用组合 - 而不是创建 A 的实例,只需将其包装在其他类中并使用同步方法公开映射。如果 A 正在实现一些接口(interface),那么该包装类也应该实现它们,并将所有调用委托(delegate)给 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,则很容易发生。

有关上下文的更多详细信息可能有助于想出更好的东西......

关于java - 从多个类访问未同步的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25548718/

相关文章:

git - 当前代码库的精细 git merge

Java:仅当文本字段具有特定值时如何激活按钮?

java - ActiveMQ授权

java - 灵活的倒计时?

windows - Delphi 从线程调用 shgetfileinfo 失败

java - java RMI中本地方法调用是否等待远程返回值?

rust - 如何在Rust中使用Mutex创建关键部分?

java - 创建 Spring Web 应用程序 : Steps?

java - Java多线程性能,创建新对象或者使用synchronized

Python threading.Condition.notify_all() 不触发下一个线程