50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

构建更好的线程安全集合

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

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

关注

评论

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

化工产业业态数字升级案例,看摩贝如何快速打通全场景互融互通?

数商云

数字化转型 企业数字化

集成测试时 MockMvc 无法注入

程序员小航

Java 后端 单元测试

OpenHarmony开源开发者成长计划 | 知识赋能第六期预告—从零上手OpenHarmony智能家居项目

OpenHarmony开发者

OpenHarmony

力扣每日一练之二维数组上篇Day4

京与旧铺

6月月更

架构实战营6期,毕业总结

本人法海

「架构实战营」

【用户文章转载】版本管理这件事,没有偏执,惟有极致

龙智—DevSecOps解决方案

游戏开发 版本管理 CI工具链 周版本制度

模块九:毕业设计

本人法海

「架构实战营」

通过DAO的现状,看Web3最具影响力的基础设施M-DAO

西柚子

el-select数据量过大引发卡顿,怎么办?

华为云开发者联盟

前端 测试 数据 华为云

【LeetCode】数组中的 k-diff 数对Java题解

Albert

LeetCode 6月月更

leetcode 198. House Robber 打家劫舍(中等)

okokabcd

LeetCode 动态规划 数据结构与算法

【网易云信】C++ 静态反射在网易云信 SDK 中的实践

网易智企

c++ 开发工具

阿里云智能编码插件进行了一个上新大动作

阿里云云效

云计算 阿里云 云原生 代码

vue prop传递数据

小恺

6月月更

浅谈 REST API 身份验证的四种方法

wljslmz

REST API 6月月更

频频破圈,走向百业:大模型的毕业季

脑极体

一文带你认识HTML

未见花闻

6月月更

感谢有你!Apache DolphinScheduler 项目 GitHub star 突破 8k

白鲸开源

Apache 大数据 开源 DolphinScheduler workflow

我为 Netty 贡献源码 | 且看 Netty 如何应对 TCP 连接的正常关闭,异常关闭,半关闭场景

bin的技术小屋

Java 网络编程 Netty TCP/IP 6月月更

ebook下载 | 灵雀云发布《 企业高管IT战略指南——为何选择容器与Kubernetes》

York

Kubernetes 容器 云原生 系统架构 技术选型

如何针对海外不同地区进行音视频自动化测试?丨Dev for Dev 专栏

声网

自动化测试 Dev for Dev

IP核是什么?有什么类型?半导体IP核全攻略

龙智—DevSecOps解决方案

知识产权 半导体 芯片开发 半导体IP核 IP核管理

八大误区,逐个击破(3):在云上,变更和数据的管理都不足为虑

龙智—DevSecOps解决方案

atlassian云版 版本选择 迁移上云

对抗软件复杂度的战争

阿里技术

软件架构 复杂度

虎符交易所Hoo推出挂单活动 未成交订单最高可得 200%APY

区块链前沿News

Hoo 虎符交易所

测试基础之:面试的信心来源于过硬的基础

甜甜的白桃

软件测试 核心竞争力 测试开发 功能测试 6月月更

盘点一些好用且小众的 Markdown 编辑器

宇宙之一粟

markdown编辑器 6月月更

C++ 静态反射在网易云信 SDK 中的实践

网易云信

c++ 开发工具

网站制作FAQ页面必要性及方法

小炮

通过DAO的现状,看Web3最具影响力的基础设施M-DAO

小哈区块

转转统一权限系统的设计与实现(设计篇)

转转技术团队

权限系统 rbac

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