2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

构建更好的线程安全集合

  • 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:281764
用户头像

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

关注

评论

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

国内20家优秀一线低代码平台推荐,经典收藏

J2PaaS低代码平台

低代码 开发工具 低代码平台 J2PaaS低代码

制造业企业数据平台建设最佳实践分享

华为云开发者联盟

数字化转型 数据平台 制造业 华为工业云平台 数据应用

再论ORACLE上云通用技术方案

天翼云开发者社区

天翼云分布式缓存服务(Redis)的几个核心概念

天翼云开发者社区

夯实领军者地位 奶酪业务协同发展领先赛道

科技新消息

61%!产品+渠道创新 蒙牛冰淇淋业绩收录有史高增长

科技新消息

蒙牛2021年报:数智化大脑为乳业插上腾飞翅膀

科技新消息

领域驱动设计入门与实践[下]

LigaAI

团队管理 DDD 领域驱动设计思想 LigaAI

天翼云新一代V5云主机,Kvm之生,Xen之死!

天翼云开发者社区

PolarDB-X 正式发布2.1.0版本,Paxos 重磅开源

阿里云数据库开源

数据库 阿里云 开源 分布式 PolarDB-X

墨天轮访谈 | 腾讯张铭:带你揭秘王者荣耀背后的游戏数据库 TcaplusDB

墨天轮

数据库 TcaplusDB 国产数据库

专属云资源包计算规格探秘

天翼云开发者社区

设计消息队列存储消息数据的 MySQL 表格

唐尤华

架构实战营

程序员不好招了吗,web前端培训应该怎么学习

@零度

前端开发

java培训浅谈程序员怎么避免面试过程中碰壁

@零度

面试 JAVA开发

Linux 管道操作符详解

CRMEB

易观分析:海外业务亮眼,研发+IP运营助力中手游持续增长

易观分析

IP 中手游

手绘模型图带你认识Kafka服务端网络模型

华为云开发者联盟

kafka 多线程 网络模型 Reactor多线程 Processor

压测做的不对,等于白做

基调听云

性能测试 压测 全链路压测

每周更新 | Verilog测试用例及波形展示图功能上线

ShowMeBug

整机生产制造头部厂商雷神科技加入龙蜥社区

OpenAnolis小助手

Linux 开源 整机

实施知识管理过程中存在的问题(内附解决方案)

小炮

知识管理

芝士就是力量!蒙牛2021年报笑出大大的CHEESE

科技新消息

大数据培训程序员面试屡次碰壁怎么办

@零度

面试 大数据开发

天翼云分布式缓存服务(Redis)的应用场景(干货)

天翼云开发者社区

把一整个生态圈藏进大沙漠 看蒙牛如何在每一滴奶中藏进玄机

科技新消息

打造中国优质奶源基地 筑牢高质量发展基石

科技新消息

爆款国民冰淇淋原来是这样“凝冻”出来的

科技新消息

【课程汇总】OpenHarmony全场景Demo数字管家系列课(附链接)

OpenHarmony开发者

OpenHarmony 数字管家

GPU时代来临!

Finovy Cloud

人工智能 gpu GPU服务器

人工智能融合赋能平台,赋能智慧城市智能化升级

脑极体

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