我有以下代码,可以在同一秒通过多个网络请求调用。因此,我不希望第二个以上请求访问数据库,而是等到第一个请求访问数据库。
我应该重构它以使用Lazy<T>
改为 keyword 类?如果 10 个呼叫Lazy<T>
一段代码同时发生,其中 9 个调用是否会等待第一个调用完成?
public class ThemeService : IThemeService
{
private static readonly object SyncLock = new object();
private static IList<Theme> _themes;
private readonly IRepository<Theme> _themeRepository;
<snip snip snip>
#region Implementation of IThemeService
public IList<Theme> Find()
{
if (_themes == null)
{
lock (SyncLock)
{
if (_themes == null)
{
// Load all the themes from the Db.
_themes = _themeRepository.Find().ToList();
}
}
}
return _themes;
}
<sip snip snip>
#endregion
}
是的,你可以使用Lazy<T>
From MSDN http://msdn.microsoft.com/en-us/library/dd997286.aspx:
默认情况下,Lazy 对象是线程安全的。也就是说,如果
构造函数没有指定线程安全的种类,Lazy
它创建的对象是线程安全的。在多线程场景下,
第一个线程访问线程安全 Lazy 的 Value 属性
对象为所有线程上的所有后续访问初始化它, 和
所有线程共享相同的数据。因此,哪个并不重要
线程初始化对象,竞争条件是良性的。
是的,它不是一个关键字 - 它是一个 .NET 框架类,它形式化了延迟初始化经常需要的用例,并提供开箱即用的功能,因此您不必“手动”执行此操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)