我在服务上使用静态缓存,当缺少密钥并被迫从数据库获取数据时(使用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()
工作正常,但我不明白为什么?