Я использую статический кеш в службе и обнаружил проблему совпадения в NHibernate Session, когда ключ отсутствовал и был вынужден получить из базы данных (используя Evict).
Я написал предложение блокировки в коде (абстракция ниже), чтобы решить проблему, но я не могу понять, что блокировка не работала.Наконец, я включил readonly в статическую переменную «lock» и работал, но я не могу понять, почему не работает, когда присвоение статической переменной было только над классом, как это работает?
private static object lockCacheElement = new object()
....
public static T ManageCacheElement<T>(int objectId, string key, Func<T> findById) {
lock (lockCacheElement)
{
Log.DebugFormat("ManageCacheElement({0}): START", key);
if (TryGetDataElement<T>(key, out result))
{
Log.DebugFormat("ManageCacheElement({0}): END1 ", key);
return result;
}
else
{
result = findById(objectId, true);
SetDataElement(key, result);
Log.DebugFormat("ManageCacheElement({0}): END2 ", key);
return result;
}
}
}
Этот код отслеживает что-то вроде этого:
{DEBUG} 28/11 17:37:01.0423 [67] - ManageCacheElement(xxx): START
{DEBUG} 28/11 17:37:01.0423 [72] - ManageCacheElement(xxx): START
{DEBUG} 28/11 17:37:01.0423 [72] - ManageCacheElement(xxx): END1
{DEBUG} 28/11 17:37:01.0423 [92] - ManageCacheElement(xxx): START
{DEBUG} 28/11 17:37:01.0423 [92] - ManageCacheElement(xxx): END1
{DEBUG} 28/11 17:37:01.0580 [96] - ManageCacheElement(xxx): START
{DEBUG} 28/11 17:37:01.0580 [96] - ManageCacheElement(xxx): END1
{DEBUG} 28/11 17:37:01.0580 [10] - ManageCacheElement(xxx): START
И если я установлю модификатор readonly на lockCacheElement.
private static readonly object lockCacheElement = new object()
Он работает нормально, но я не могу понять, почему?