当前位置:  开发笔记 > 编程语言 > 正文

System.Lazy <T>具有不同的线程安全模式

如何解决《System.Lazy<T>具有不同的线程安全模式》经验,为你挑选了0个好方法。

.NET 4.0的System.Lazy 类通过枚举LazyThreadSafetyMode提供三种线程安全模式,我将其概括为:

LazyThreadSafetyMode.None - 不是线程安全的.

LazyThreadSafetyMode.ExecutionAndPublication - 只有一个并发线程将尝试创建基础值.成功创建后,所有等待的线程将获得相同的值.如果在创建期间发生未处理的异常,则将在每个等待的线程上重新抛出它,在每次后续尝试访问基础值时进行缓存和重新抛出.

LazyThreadSafetyMode.PublicationOnly - 多个并发线程将尝试创建基础值,但第一个成功将确定传递给所有线程的值.如果在创建期间发生未处理的异常,则不会对其进行高速缓存,并且并发和后续尝试访问基础值将重新尝试创建并可能成功.

我想要一个延迟初始化的值,它遵循稍微不同的线程安全规则,即:

只有一个并发线程将尝试创建基础值.成功创建后,所有等待的线程将获得相同的值.如果在创建期间发生未处理的异常,它将在每个等待的线程上重新抛出,但它不会被缓存,后续尝试访问基础值将重新尝试创建并可能成功.

因此,与LazyThreadSafetyMode.ExecutionAndPublication的关键不同之在于,如果创建时"先行"失败,则可以在以后重新尝试.

是否存在提供这些语义的现有(.NET 4.0)类,还是我必须自己编写?如果我自己滚动是否有一种聪明的方法可以在实现中重用现有的Lazy 以避免显式锁定/同步?


注意对于一个用例,假设"创建"可能很昂贵并且容易出现间歇性错误,例如从远程服务器获取大量数据.我不想进行多次并发尝试来获取数据,因为它们可能都会失败或全部成功.但是,如果它们失败了,我希望以后能够重试.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有