【发布时间】:2019-11-21 10:44:36
【问题描述】:
我想将对 ASP.Net MemoryCache 的调用封装在一个适用于业务类型的类中。
这是我写的:
public interface IMyModelStore
{
MyModel RetrieveMyModel(Guid id);
void StoreMyModel(MyModel obj);
}
public sealed class InMemoryCache : IMyModelStore
{
public static InMemoryCache Instance { get; } = new InMemoryCache(TimeSpan.FromMinutes(30));
private readonly TimeSpan _expiration;
private readonly CacheItemPolicy _cachePolicy;
private InMemoryCache(TimeSpan expiration)
{
this._expiration = expiration;
_cachePolicy = new CacheItemPolicy
{
SlidingExpiration = _expiration
};
}
public RetrieveMyModel(Guid id)
{
if (id == Guid.Empty) throw new ArgumentOutOfRangeException(nameof(id));
return (MyModel)MemoryCache.Default.Get(id.ToString());
}
public void StoreMyModel(MyModel obj)
{
MemoryCache.Default.Add(obj.Id.ToString(), obj, _cachePolicy);
}
}
我的感觉是我不必处理线程安全问题,因为我的代码只是获取数据并将数据传递给线程安全的 MemoryCache。
我说的对吗?
我想,唯一可能导致麻烦的情况是,当一个线程调用 RetrieveMyModel 的同时另一个线程使用相同的 ID 调用 StoreMyModel。
【问题讨论】:
-
您的
InMemoryCache本身是线程安全的。正如您所指出的,可能还有其他种族具有不同的线程同时操纵MyModel。 -
谢谢@canton7。我稍微改写了最后一句话。你的cmets表明我不清楚。我不是在谈论 MyModel 对象的线程安全性。
-
为此,您必须查看
MemoryCache的行为方式。你的类和MemoryCache一样是线程安全的,没有更好,也没有更差。 -
有一个潜在风险的事情。
MemoryCache.Default的实现由于某种原因使用了不完全线程安全的双重检查锁定模式,因此在可以从不同线程调用此属性的代码中使用MemoryCache.Default不是线程安全的。
标签: c# multithreading thread-safety