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