У меня есть случай использования, когда есть один писатель, который пишет на карту, которая будет содержать некоторые справочные данные. Эта карта гидратируется в начале приложения, после чего она никогда не будет изменена.
У меня есть несколько потоков, которые будут читать эту карту после завершения начальной гидратации. Есть ли что-то, что я должен иметь в виду, чтобы не столкнуться с какими-либо условиями гонки здесь?
У меня уже есть блокирующая очередь в моем приложении, которая помогает направлять запросы различным потокам и каждому вызывающему. возвращает будущее, которое они могут использовать, чтобы прочитать результат. Мне было интересно, нужно ли следовать той же вещи для доступа к этой карте, или я мог бы просто передать ссылку на карту всем потокам для прямого доступа, поскольку они будут только читать ее.
На основе комментариев @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;
}
}