Моля, обърнете внимание: Въпреки че в този въпрос се споменава Java, мисля, че в основата си това е проблем с OOP/паралелност и вероятно може да бъде отговорен от всеки със значителен опит в програмирането.
Така че изграждам 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'
}
}
}
Какви са моите опции тук? Как да създам и зареждащото устройство, и конфигурацията, за да бъдат безопасни за нишки, където конфигурацията може да се променя от страна на клиента (при поискване) или асинхронно от фонов работник нишка?