Блокировка над статическим объектом блокировки - PullRequest
0 голосов
/ 29 ноября 2018

Я использую статический кеш в службе и обнаружил проблему совпадения в 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()

Он работает нормально, но я не могу понять, почему?

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