锁定静态锁定对象

时间:2018-11-29 08:51:16

标签: c# locking

我在服务上使用静态缓存,当缺少密钥并被迫从数据库获取数据时(使用Evict),我在NHibernate Session中发现了一个并发问题。

我在代码上写了一个锁句(下面是一个抽象)来解决问题,但是我不明白该锁不起作用。最后,我将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

如果我在lockCacheElement上设置了只读修饰符。

private static readonly object lockCacheElement = new object()

工作正常,但我不明白为什么?

0 个答案:

没有答案