Ошибка статического кэша
-
05-07-2019 - |
Вопрос
У меня есть статический кэш, который в установленное время обновляет общий список объектов из базы данных. Р>
Это просто статический список:
private static List<myObject> _myObject;
public List<myObject> FillMyObject()
{
if(_myObject == null || myTimer)
_myObject = getfromDataBase();
}
У меня есть 2 метода для обновления моего объекта, которые называются UpdateMyObject
и RemoveAnEntryFromMyObject
.
Кажется, все работает нормально, но все время от времени я получаю массу ошибок. Тогда это уходит и кажется снова хорошо. Кто-нибудь знает что происходит? Р>
Решение
Вам необходимо использовать блокировку заявление всякий раз, когда вы обращаетесь к статическому кешу или обновляете его. Оператор блокировки будет блокировать выполнение других потоков до его завершения. Если вы этого не сделаете, у вас может быть один поток, пытающийся перебрать коллекцию одновременно с удалением строки другим потоком. В зависимости от конкретного сценария вы можете использовать двойную проверку блокировки . Р>
static readonly object lockObj = new object();
private static List<myObject> _myObject;
public List<myObject> FillMyObject()
{
lock (lockObj)
{
if(_myObject == null || myTimer)
_myObject = getfromDataBase();
}
}
public List<myObject> UpdateMyObject(somevalue)
{
lock (lockObj)
{
_myObject.RemoveAll(delegate(myObject o)
{
return o.somevalue == somevalue;
});)
}
}