Обратите внимание: хотя в этом вопросе упоминается Java, я думаю, что это проблема ООП / параллелизма, и, вероятно, на нее может ответить любой, у кого есть значительный опыт программирования.
Итак, я создаю ConfigurationLoader
, который будет читать Configuration
POJO из удаленной службы и делать его доступным через API. Несколько вещей:
- Как только
ConfigurationLoader
запрашиваетсяConfiguration
в первый раз, фоновый поток (рабочий) будет проверять связь с удаленной службой каждые, скажем, 30 секунд, для получения обновлений, а затем применяет эти обновления к экземпляруConfiguration
; и - Если
Configuration
изменен, фоновый исполнитель будет уведомлен об изменении и отправит «новый»Configuration
в удаленную службу; - И
ConfigurationLoader
, иConfiguration
должны быть поточно-ориентированными.
Поэтому, когда я думаю о «потокобезопасности», первое, о чем я думаю, - это неизменяемость, которая приводит меня к отличным проектам, таким как Неизменяемые. Проблема в том, что Configuration
не может быть неизменным, потому что нам нужно иметь возможность изменить его на стороне клиента, а затем позволить загрузчику передать эти изменения обратно на сервер.
Следующей моей мыслью было попробовать сделать как ConfigurationLoader
, так и Configuration
синглтоны, но проблема в том, что ConfigurationLoader
требует много аргументов для его создания, и поскольку этот отличный ответ указывает, что синглтон, который принимает аргументы при построении, не является истинным синглтоном.
// Groovy pseudo-code
class Configuration {
// Immutable? Singleton? Other?
}
class ConfigurationLoader {
// private fields
Configuration configuration
ConfigurationLoader(int fizz, boolean buzz, Foo foo, List<Bar> bars) {
super()
this.fizz = fizz
this.buzz = buzz;
// etc.
}
Configuration loadConfiguration() {
if(configuration == null) {
// Create background worker that will constantly update
// 'configuration'
}
}
}
Какие здесь у меня варианты? Как мне создать и загрузчик, и конфигурацию, чтобы обеспечить потокобезопасность, когда конфигурация может изменяться на стороне клиента (по запросу) или асинхронно с помощью фонового рабочего нить?