@Singleton
@LocalBean
@Startup
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class DeliverersHolderSingleton {
private volatile Map<String, Deliverer> deliverers;
@PostConstruct
private void init() {
Map<String, Deliverer> deliverersMod = new HashMap<>();
for (String delivererName : delivererNames) {
/*gettig deliverer by name*/
deliverersMod.put(delivererName, deliverer);
}
deliverers = Collections.unmodifiableMap(deliverersMod);
}
public Deliverer getDeliverer(String delivererName) {
return deliverers.get(delivererName);
}
@Schedule(minute="*", hour="*")
public void maintenance() {
init();
}
}
Singleton используется для хранения данных. Данные обновляются один раз в минуту. Возможно ли, что чтение из unmodifiableMap будет проблемой с синхронизацией? Возможно ли, что произойдет переупорядочение в методе init и будет опубликована ссылка на сборник, но сбор не заполняется полностью?Параллельный доступ к unmodifiableMap
Я предполагаю, что решающая проблема заключается в том, является ли возвращение метода '@ PostConstruct'« безопасной публикацией »данных, установленных там. – Raedwald
Если мы предположим, что это не так, будут выставлены наполовину построенные бобы, это будет довольно большой недостаток дизайна, который укусит вас в a ** в нескольких местах. – Kayaman
'volbers' volatile должен предотвращать переупорядочение, и ваш класс должен работать должным образом (предполагая, что * получение поставщика по имени * является безопасным потоком). – assylias