Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 地图的单个编写器和多个读卡器_Java_Multithreading_Concurrency_Hashmap - Fatal编程技术网

Java 地图的单个编写器和多个读卡器

Java 地图的单个编写器和多个读卡器,java,multithreading,concurrency,hashmap,Java,Multithreading,Concurrency,Hashmap,我有一个用例,其中有一个编写器正在向包含一些参考数据的地图进行写入。此地图在应用开始时水合,之后保证其不会被修改 我有多个线程,会在初始水合作用完成后阅读这张地图。我是否应该记住一些事情,以确保我不会在这里遇到任何比赛条件 我的应用程序中已经有一个阻塞队列,它可以帮助将请求路由到不同的线程,每个调用方都可以返回一个未来,他们可以用来读取结果。我想知道访问这个映射是否需要遵循同样的方法,或者我可以将映射的引用传递给所有线程直接访问,因为它们只会阅读它 根据@ControlAltDel和@Solom

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

我有多个线程,会在初始水合作用完成后阅读这张地图。我是否应该记住一些事情,以确保我不会在这里遇到任何比赛条件

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

根据@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
}
公共类MySpringAppConfiguration{
@豆子
公共地图映射(){
返回新的HashMap();
}
@豆子
公共作家{
返回新的编写器(fooMapping());
}
@豆子
公共阅读器worker1阅读器1(){
返回新的ReaderWorker1(Collections.unmodifiableMap(fooMapping());
}
//此处定义的其他读取器类型
}
ReaderWorker1.java

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

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

//reader logic
}
公共类ReaderWorker1{
私人最终地图绘制;
公共ReaderWorker(地图映射){
this.fooMapping=fooMapping;
}
//读取器逻辑
}
Writer.java

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

public Writer(Map<String, Foo> fooMapping) {
  this.fooMapping = fooMapping;
}
}
公共类编写器{
私人最终地图绘制;
公共编写器(地图映射){
this.fooMapping=fooMapping;
}
}

将对映射的不可变引用传递给所有线程是安全的:如果构建映射后没有写入程序,则不需要同步读取。@ControlAltDel我的应用程序是SpringBoot应用程序,我正在将映射注入所有读卡器类中。我不确定这是否有效。有没有一种模式适合你的建议?@harshvardhan.agr如果你不尝试,你永远不会成功know@ControlAltDel,如果OP真的尝试过,那么他们仍然不知道。通过反复试验验证多线程应用程序是不明智的。