昨天在做code review时看到一位同事写了这样的代码。这段代码的目的使用Double Check的做法来保证线程安全的延迟加载。但是我看到这代码之后发现了一个问题,这个问题不是第一次出现。因此,我打算在博客上记录一笔,希望可以给更多人提个醒吧。
假设,我们有这样一个Category类型,记录的是一个树型的分类结构:
public class Category { public int CategoryID { get; set; } public List<Category> Children { get; set; } }
然后,我们需要一个CategoryLoader,提供一个Get方法从ID获得指定的Category对象:
public class CategoryLoader { private object m_mutex = new object(); private Dictionary<int, Category> m_categories; public Category GetCategory(int id) { if (this.m_categories == null) { lock (this.m_mutex) { if (this.m_categories == null) { LoadCategories(); } } } return this.m_categories[id]; } private void LoadCategories() { this.m_categories = new Dictionary<int, Category>(); this.Fill(GetCategoryRoots()); } private void Fill(IEnumerable<Category> categories) { foreach (var cat in categories) { this.m_categories.Add(cat.CategoryID, cat); Fill(cat.Children); } } private IEnumerable<Category> GetCategoryRoots() { ... } } ::...
免责声明:
当前网页内容, 由 大妈 ZoomQuiet 使用工具: ScrapBook :: Firefox Extension 人工从互联网中收集并分享;
内容版权归原作者所有;
本人对内容的有效性/合法性不承担任何强制性责任.
若有不妥, 欢迎评注提醒:
或是邮件反馈可也:
askdama[AT]googlegroups.com
点击注册~> 获得 100$ 体验券:![]()
订阅 substack 体验古早写作:
关注公众号, 持续获得相关各种嗯哼:
![]()
自怼圈/年度番新
![]()
关于 ~ DebugUself with DAMA ;-)
粤ICP备18025058号-1
公安备案号: 44049002000656 ...::