Создание сильной ссылки из Weakreference
Ниже приведен пример кода нашего приложения, в котором мы пытаемся сохранить слабую ссылку на огромный объект модели страницы, который занимает много памяти.
Dictionary<int,WeakReference> modelCache;
IPageModel ReadPageModel()
{
IPageModel page;
if (!modelCache.ContainsKey(cacheKey) || !modelCache[cacheKey].IsAlive)
{
model = new PageModel();
modelCache[cacheKey] = new WeakReference(Model);
}
else
{
model = modelCache[cacheKey].Target as IPageModel;
}
return model;
}
Модель, которую мы возвращаем (в другой части), является ссылкой на слабый объект, поэтому в более позднее время она может быть нулевой.
Есть ли способ, чтобы мы могли создать сильную ссылку на этот объект, и позже, когда мы закончили с объектом, мы можем сделать его слабой ссылкой.
Я сталкивался с некоторыми примерами, когда слабые ссылки преобразуются в сильные, а не наоборот.
2 ответа
Java gc объекты со слабой ссылкой только тогда, когда они ТОЛЬКО являются слабыми ссылками. Таким образом, до тех пор, пока у вас есть нормальная ссылка на объект, java не получит его и вы не получите нулевую ссылку.
Спасибо, Ксено Лупус,
Таким образом, ссылка была сильной ссылкой, но прежде, чем я поместил объект значения, он был собран. Теперь я изменил код следующим образом:
IPageModel page;
if (modelCache.ContainsKey(cacheKey) && modelCache[cacheKey].IsAlive)
{
model = modelCache[cacheKey].Target as IPageModel;
}
if(model == null)
{
model = new PageModel();
modelCache[cacheKey] = new WeakReference(Model);
}
return model;