Один писатель и несколько читателей для карты - PullRequest
0 голосов
/ 04 марта 2020

У меня есть случай использования, когда есть один писатель, который пишет на карту, которая будет содержать некоторые справочные данные. Эта карта гидратируется в начале приложения, после чего она никогда не будет изменена.

У меня есть несколько потоков, которые будут читать эту карту после завершения начальной гидратации. Есть ли что-то, что я должен иметь в виду, чтобы не столкнуться с какими-либо условиями гонки здесь?

У меня уже есть блокирующая очередь в моем приложении, которая помогает направлять запросы различным потокам и каждому вызывающему. возвращает будущее, которое они могут использовать, чтобы прочитать результат. Мне было интересно, нужно ли следовать той же вещи для доступа к этой карте, или я мог бы просто передать ссылку на карту всем потокам для прямого доступа, поскольку они будут только читать ее.

На основе комментариев @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;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...