java - 地图的单个作者和多个阅读者
问题描述
我有一个用例,其中有一个写入器正在写入包含一些参考数据的地图。此地图在应用程序开始时被水合,之后它保证永远不会被修改。
在初始水合完成后,我有多个线程将读取此地图。是否有一些事情我应该牢记以确保我不会在这里遇到任何竞争条件?
我的应用程序中已经有一个阻塞队列,可以帮助将请求路由到各个线程,并且每个调用者都会返回一个他们可以用来读取结果的未来。我想知道是否有必要遵循相同的方法来访问此映射,或者我可以将映射的引用传递给所有线程以进行直接访问,因为它们只会读取它。
根据@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;
}
}
解决方案
推荐阅读
- http - 从 api 获取数据时如何在 Flutter 中填充列表
- php - Laravel 制作另一个数组对象的数组
- mysql - 重新创建 master 时重新创建副本
- angular - 类型错误:无法读取 Angular/Jasmine 中未定义的属性“下一个”
- vba - 将列值设置为用户输入,限制为日期格式
- contentful - 无法获取条目列表:找不到资源(内容)
- android - 错误无法解析“:app @debugAndroidTest/compileClasspath”的依赖项无法解析项目:SimpleCommons
- latex - Manim 没有在 MacOs 中正确绘制电路
- javascript - ReactJS - 如何在提交表单时记录导致 400 错误代码的特定字段
- html - 使用指定文本查找属性的值