Как устранить утечку памяти в многопоточном режиме? - PullRequest
0 голосов
/ 14 февраля 2019

У меня интересный случай утечки памяти в многопоточной среде.У меня следующая логика:

public void update(string key, CustomObj NewResource)
{
  //fetch old resource for the given key from the concurrent hashmap
  // update hashmap with the newResource for the given key
  // close the old resource to prevent memory leak    
}

public void read (string key)
{
   // return resource for the given key
}

Теперь, если у меня есть два потока:
Поток № 1: вызов метода обновления для обновления ресурса для ключа K
Поток № 2: вызов метода чтения для чтенияресурс для того же ключа K.

Примечание : CustomObj принадлежит сторонней библиотеке, поэтому я не могу добавить в нее метод finalize для его закрытия.

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

Не могли бы вы рассказать, как обеспечить безопасность потока без памятиутечка в этом сценарии?

1 Ответ

0 голосов
/ 14 февраля 2019

Никогда не следует использовать finalize() по причинам, слишком широким для обсуждения здесь.

Если несколько потоков могут работать с одним объектом одновременно, то вы можете использовать «подсчет ссылок», чтобы отслеживать, когда ресурсдолжен быть закрыт.

Каждый поток / функция / и т. Д., Который в настоящее время работает с объектом, увеличивает свой «счетчик пользователей» на единицу, когда он получает доступ к объекту.Когда он перестает работать с ним, он уменьшает число своих пользователей на единицу.Поток, который уменьшил счет до нуля, закрывает объект.Вы можете использовать различные «атомарные» примитивы, предоставляемые стандартной библиотекой java, для создания решения без блокировки.

Поскольку это объект из третьей библиотеки pary, вам нужно будет создать некоторыесвоего рода обертка для отслеживания ссылок.

PS: Обычно не рекомендуется использовать объекты с общим состоянием между потоками - это напрашивается на проблемы - проблемы синхронизации, скачки данных, потеря производительности при синхронизации и т. д.

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