首页 > 解决方案 > 地图的单个作者和多个阅读者

问题描述

我有一个用例,其中有一个写入器正在写入包含一些参考数据的地图。此地图在应用程序开始时被水合,之后它保证永远不会被修改。

在初始水合完成后,我有多个线程将读取此地图。是否有一些事情我应该牢记以确保我不会在这里遇到任何竞争条件?

我的应用程序中已经有一个阻塞队列,可以帮助将请求路由到各个线程,并且每个调用者都会返回一个他们可以用来读取结果的未来。我想知道是否有必要遵循相同的方法来访问此映射,或者我可以将映射的引用传递给所有线程以进行直接访问,因为它们只会读取它。

根据@ControlAltDel 和@SolomonSlow 的评论,我认为以下应该做我需要的

Foo.java

public class Foo {
  private final String f1;
  private final Integer f2;
  public Foo(String f1, Integer f2) {
     this.f1 = f1;
     this.f2 = f2;
  }
  //hashcode, toString, equals go here
}

MySpringAppConfiguration.java

public class MySpringAppConfiguration {
@Bean
public Map<String, Foo> fooMapping() {
  return new HashMap<>();
}

@Bean
public Writer writer() {
  return new Writer(fooMapping());
}

@Bean
public ReaderWorker1 reader1() {
  return new ReaderWorker1(Collections.unmodifiableMap(fooMapping()));
}
//other reader types defined here
}

ReaderWorker1.java

public class ReaderWorker1 {
private final Map<String, Foo> fooMapping;

public ReaderWorker(Map<String, Foo> fooMapping) {
  this.fooMapping = fooMapping;
}

//reader logic
}

Writer.java

public class Writer {
private final Map<String, Foo> fooMapping;

public Writer(Map<String, Foo> fooMapping) {
  this.fooMapping = fooMapping;
}
}

标签: javamultithreadingconcurrencyhashmap

解决方案


推荐阅读