写点什么

构建更好的线程安全集合

  • 2009-02-26
  • 本文字数:1027 字

    阅读完需:约 3 分钟

大部分线程安全的集合都有一些基础性的缺陷:虽然每个操作都是线程安全的,但是多个操作无法组合起来使用。这意味着一些基本的执行顺序,例如在弹出顶部元素之前检查栈内元素数量会出现潜在的危险。尽管已经有一些 API 设法将某些操作绑定起来(例如.NET 4 的Coordination Data Structures ),但是它们往往会引入丑陋的方法(如TryDequeue)。

.NET 1 里的集合尝试了另一种方式,它们会对外暴露一个SyncRoot 属性,而不是在内部进行锁定。虽然SyncRoot 仍然是同步对象的默认机制,但是.NET 2 已经抛弃了SyncRoot/Wrapper 设计模式

那么该如何创建一个可用的组合式API 呢?Jared Parson 认为集合不应该直接暴露出线程安全的API,所有的方法都应该属于一个临时的对象,而这个对象只有在您锁定集合的时候才被创建出来。这个临时对象是集合的“钥匙”,只有钥匙的持有者才能获取集合内容。

以下示例为 Jared Parsons 的线程安全队列

复制代码
static void Example1(ThreadSafeQueue<int></int> queue) {<br></br> using (var locked = queue.Lock()) {<br></br> if (locked.Count > 0) {<br></br> var first = locked.Dequeue();<br></br> }<br></br> }<br></br>}

名为 locked 的对象本身不是线程安全的,但是开发人员只有在 using 代码块中才能正确执行操作。在遵守了这一简单规则之后,开发块里的所有代码就是线程安全的。Jared 解释道:

与大部分线程安全的设计一样,这些代码还是有被误用的可能:

  1. 在 ILockedQueue 销毁之后却继续使用它。这种做法应该被禁止,用户现有的知识一般足以避免这个问题。此外一些静态检查工具,例如 FxCop,会把这种做法识别为一个错误。我们也可以使用一种更严厉的做法来阻止此类情况出现:添加一个 disposed 标记,并在每个方法中进行检查。
  2. 如果用户在跨越多个 Lock 语句的情况下保留某个值(例如 Count),那么可能会对集合的状况出现错误的判断和假设。
  3. 如果用户没有正确销毁 ILockedQueue,那么这个对象会被永久锁定。幸运的是,对于实现了 IDisposable 的对象,FxCop 同样会将这种做法识别为一个错误——尽管这不是一个万分稳妥的机制。
  4. 无法确定用户是否会长期持有 ILockedQueue 对象。虽然 IDisposable 一般包含着“短期”的意味,但是这并不能做出完美的保证。
  5. ILockedQueue 并不是线程安全的。虽然一般情况下用户不会把 IDisposable 对象交给多个线程使用,但这也是必须考虑到的情况之一。

查看英文原文: Building a Better Thread-safe Collection

2009-02-26 06:281659
用户头像

发布了 157 篇内容, 共 57.0 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

如何提高企业独立站的转化率

九凌网络

一文总结 C++ 常量表达式、constexpr 和 const

不在线第一只蜗牛

c++ 开发语言 tldr

技术专栏丨Rust 语言简介及其在 Fabarta 技术栈中的应用

Fabarta

思码逸企业版 4.0 特性之三:研发效能数据的智能化分析与解读

思码逸研发效能

云电脑Win7系统安装报错详解:问题与解决方案

天翼云开发者社区

云计算 云电脑 系统安装

揭秘智能商品计划管理系统:为何服装企业老板争相引入?

第七在线

云上业务一键性能调优,应用程序性能诊断工具 Btune 上线

百度Geek说

小程序 百度智能云

《人工智能在测试开发中的应用》

测吧(北京)科技有限公司

测试

AI 大模型微调训练营第 0 期 -- 毕业总结

Jabez

多人协同开发场景,如何做到高效发布

阿里巴巴云原生

阿里云 微服务 云原生 云效

多人协同开发场景,如何做到高效发布

阿里云云效

阿里云 云原生 云效

spark为什么比mapreduce快?

京东科技开发者

面试官:如何实现多级缓存?

王磊

Java 面试

“新程序员”必须学会的8个GPT提问技术

思码逸研发效能

面向未来的全面预算管理,财务团队应具备的技能

智达方通

全面预算管理 财务团队

利用故事推动企业变革:如何提升数据分析技能

智达方通

数据分析 数据可视化 全面预算管理 数据故事

云服务器怎么搭建:从零到运行的基础指南

天翼云开发者社区

云计算 云服务器

数字先锋| 乘云而上!天翼云助力东吴人寿开启云端办公新体验

天翼云开发者社区

云计算

人工智能与测试开发:新时代的黄金组合

测试人

人工智能 软件测试 自动化测试 测试开发

当平台工程遇上DevEx:打造卓越的开发者体验

京东科技开发者

后端:手把手带你精简代码-京东零售实践

京东零售技术

Java 后端 代码精简

春节后,必读的12篇大模型论文

学术头条

人工智能 大模型 AIGC AI Agent

聚道云软件连接器助力生产制作行业实现数字化升级

聚道云软件连接器

技术分享 | 神级程序员都在用什么工具?

互联网工科生

IntelliJ IDEA 数据源 JNPF

构建更好的线程安全集合_.NET_Jonathan Allen_InfoQ精选文章