문제
설정 시간에 데이터베이스의 일반 객체 목록을 업데이트하는 정적 캐시가 있습니다.
단순한 정적 목록 일뿐입니다.
private static List<myObject> _myObject;
public List<myObject> FillMyObject()
{
if(_myObject == null || myTimer)
_myObject = getfromDataBase();
}
호출 된 객체를 업데이트하는 두 가지 방법이 있습니다 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;
});)
}
}
제휴하지 않습니다 StackOverflow