Я пытаюсь реализовать singleton, который собирается кэшировать и проверять конфигурацию карты, уменьшая задания в hadoop. Назовите его ConfigurationManager
.Hadoop singleton pattern uasge
Вот что у меня есть на данный момент:
public class ConfigurationManager {
private static volatile ConfigurationManager instance;
private static final String CONF_NAME = "isSomethingEnabled";
private boolean isSomethingEnabled;
private ConfigurationManager(Configuration configuration) {
this.isSomethingEnabled= configuration.getBoolean(CONF_NAME, false);
}
public static void init(Configuration configuration) {
if (instance == null) {
synchronized (ConfigurationManager.class) {
if (instance == null) {
this.instance = new ConfigurationManager(configuration);
}
}
}
}
public static ConfigurationManager get() {
return instance;
}
public boolean isSomethingEnabled() {
return isSomethingEnabled;
}
}
Как вы можете видеть, что это предназначено, чтобы быть потокобезопасным. Кроме того, он не является стандартным одноэлементным: я разделял инициализацию и методы доступа, чтобы не применять присутствие экземпляра hadoop Configuration
на вызове get
. Поэтому, чтобы использовать его, я преждевременно вызываю у предка Tool
, а затем пытаюсь получить доступ к моему синглтону, используя get
в редукторах (например, ConfigurationManager.get().isSomethingEnabled()
), но по некоторым причинам get
возвращает null
. Может ли кто-нибудь объяснить, пожалуйста, такое поведение? Может быть, карты/редукторы инициируются как отдельные процессы?
Я не вижу никакой нулевой аргумент 'получить()' метод. И почему hasoop имеет отношение к вашему вопросу? – shmosel
@shmosel, извините за неточность. Исправлена. Hadoop имеет отношение к моему вопросу, потому что obvoiusly этот код работает в изолированной среде (проверял это). Я не работаю, как только я помещаю это в описанные мной условия. –
Итак, если я правильно вас понял, вы говорите, что вы вызвали 'get (Configuration)' перед вызовом 'get()' и удивлены, увидев нуль. Как вы гарантировали, что инициализатор будет работать первым? – shmosel