Если предположить, что Map<String, SomeClass> data;
внутри класса SecondMap равно HashMap
, вы можете получить нулевое значение для ключа в двух сценариях.1. Если ключ соответствует нулевому значению.Пример "Something" -> null
.2. Если ключ не находится на карте в первую очередь.
Так что, не зная много о том, откуда поступают данные.Если одна из карт, возвращаемых getLatestData();
, вообще не имеет ключа «SomeKey» на карте, она вернет null
.
Кроме того, поскольку недостаточно информации о том, как это Map<String, SomeClass> data;
обновленный, и если он изменчив или неизменен, у вас могут быть проблемы там.Если эта карта неизменна, а SecondMap
неизменна, то, скорее всего, все в порядке.Но если вы изменяете if из нескольких потоков, вы должны сделать его ConcurrentHashMap, и если вы обновите ссылку на новый Map<String, SomeClass> data
из других потоков, внутри SecondMap
вы также должны сделать эту ссылку volatile
.
class SecondMap {
volatile Map<String, SomeClass> data; //Not necessarily a concurrent hashmap
public Map<String, SomeClass> getData() {
return data;
}
}
Если вы хотите глубже понять, когда использовать ключевое слово volatile и все тонкости гонок данных, в этом онлайн-курсе есть раздел https://www.udemy.com/java-multithreading-concurrency-performance-optimization/?couponCode=CONCURRENCY об этом.Я не видел ни одного ресурса, который бы объяснял и демонстрировал это лучше.И, к сожалению, в Интернете так много статей, которые просто объясняют это НЕПРАВИЛЬНО, что печально.
Я надеюсь, что из небольшой информации в этом вопросе я смог указать вам некоторые направления, которые могут помочь.Пожалуйста, поделитесь дополнительной информацией, если ничего из этого не работает, или если что-то работает, пожалуйста, дайте мне знать, мне интересно знать, что это было :)