Синглтон возвращает пустой объект - PullRequest
0 голосов
/ 03 апреля 2019

У нас есть реализация кэша в нашем проекте, для которой мы использовали шаблон проектирования Singleton. Класс Cache - это одноэлементный класс, в котором содержится HashMap<String,HashMap> m. Когда-нибудь, когда мы получим данные от Hashmap m. возвращенный внутренний HashMap пуст. Это происходит случайным образом, и мы не знаем, почему это происходит. В нашем коде мы убедились, что на карте не вызывается оператор remove, а также отсутствует код, удаляющий эти данные.

Любые ссылки на это будут очень полезны. Заранее спасибо.

Класс кэша: -

public Class Cache
{
    public static Cache c;
    private HashMap<String,HashMap> m ;
    private Cache()
    {
         m = new HashMap<String,HashMap>();
    }
    public static synchronized Cache getInstance()
    {
        if(c == null) { c = new Cache(); }
        return c;
    }
    public void put(String id,HashMap value)
    {    m.put(id,value);     }
    public HashMap get(String id)
    {    return m.get(id);    }
}

Код для ввода значения: -

Cache c = Cache.getInstance();
c.put("CITY_CACHE",cityMap);// cityMap is a non empty map having city data

Код для получения значения: -

Cache c = Cache.getInstance();
HashMap cityMap = c.get("CITY_CACHE");
//city Map here becomes empty sometimes

Этот сценарий происходит случайно в производственной среде, и мы не можем выполнить репликацию в непроизводственной среде. Я подозреваю это из-за GC, но у меня нет никаких доказательств, чтобы доказать это.

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Пока вы синхронизируете получение экземпляра Cache, вы не защищаете манипуляцию с внутренней картой. Вам следует либо синхронизировать эти операции, либо использовать поточно-ориентированную реализацию карты, например ConcurrentHashMap.

0 голосов
/ 03 апреля 2019

Поскольку у меня нет полной информации о вашем проекте, я могу предложить вам несколько шагов отладки. Я не думаю, что проблема связана с синхронизацией. Вполне возможно, что какая-то часть вашего кода удаляет данные до того, как вы получите те же данные (и эта ситуация может происходить с синхронизацией или без нее).

Распечатайте данные карты в журнале, если вы не нашли никаких данных с помощью вашего ключа. Проверить наличие данных в журнале? Очевидно, мы не можем сомневаться в методе get Hashmap в java:)

и да, GC тоже может быть причиной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...