【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

构建更好的线程安全集合

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

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

关注

评论

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

利用wvs扫描网站发现一个页面,暴露了错误信息

喀拉峻

网络安全

最好用的 12 款 Vue Timepicker 时间日期选择器测评推荐 - 卡拉云

蒋川

Vue Vue 3

数字化赋能三农 农行、邮储如何保“质”更保“智”?

CECBC

物联网平台的基础概念

dgiot

比5G还快10倍,你准备好迎接万兆通信了吗?

脑极体

北纬科技三步走完成DevOps转型

阿里云云效

云计算 阿里云 DevOps 云原生 #运维

元宇宙房地产演绎新“美国梦”

CECBC

Elastic 与 AWS 和解、英伟达 660亿 收购 ARM 失败|2月开源月报

腾源会

开源 腾源会

CorelDRAW2022最新版图形套件更新功能

茶色酒

CorelDRAW 2022

集合阿里云、达摩院、平头哥相关技术的HaaS,官宣出书啦!

博文视点Broadview

面试突击26:如何正确停止线程?

王磊

面试

22.04 LTS爆料现场 - UKUI 3.1带你开启“寻光”之旅

优麒麟

Linux 开源 优麒麟 UKUI

Android技术分享| 【Android 自定义View】多人视频通话控件

anyRTC开发者

android 音视频 移动开发 视频通话 自定义view

学习黑客十余年,如何成为一名安全工程师?

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

如何提升专注力?

石云升

职场经验 2月月更 专注力

基于STM32+ESP8266+华为云设计的智能家居控制系统

DS小龙哥

物联网 智能硬件 stm32 3月日更

干掉Session?这个跨域认证解决方案真的优雅!

沉默王二

Spring Boot

电动汽车行业蓬勃发展,是时候关注电动汽车软件了

龙智—DevSecOps解决方案

电动汽车 电动汽车市场 电动汽车软件

如何恢复MAC苹果电脑系统数据文件?

茶色酒

EasyRecovery15

受Prometheus启发的开源日志工具:Loki

yuexin_tech

最好用的 7 个 Vue Tree select 树形组件 - 卡拉云

蒋川

Vue Vue 3

sparksql内核解析-读书笔记

聚变

cdr2022无需序列号和密钥 直接安装即可激活

茶色酒

cdr2022

java培训应该怎么学习才能找合适的工作

@零度

JAVA开发 培训学习

华为在MWC2022为全球开发者带来HMS创新工具,全面提升消费者体验

最新动态

加密货币使得俄罗斯更容易规避制裁

CECBC

如何在 Vue 中加入图表 - Vue echarts 使用教程 - 卡拉云

蒋川

Vue Vue 3

合规性管理101:流程、规划和挑战

龙智—DevSecOps解决方案

合规性 合规性管理

Web 键盘输入法应用开发指南(1) —— 基本概念

天择

JavaScript 键盘 输入法

5G时代的海洋之歌

脑极体

水果最新FL Studio20.9.1汉化功能详解

茶色酒

Fl fl20.9

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