东亚银行、岚图汽车带你解锁 AIGC 时代的数字化人才培养各赛道新模式! 了解详情
写点什么

构建更好的线程安全集合

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

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

关注

评论

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

网易三个S级项目制作人,为什么选择在这个渠道“爆料”?

最新动态

七月创作之星挑战赛开始咯~

Openlab_cosmoplat

开源 开源社区 创作活动

热门实践丨如何结合实际业务进行 ECS 规格选型与容量验证

阿里巴巴云原生

阿里云 云原生 ECS PTS

从繁琐到高效,探索自动化部署的新境界

知者如C

VAP and VLAN: Enhancing Network Flexibility and Security

wallyslilly

MT7915

wrk - 本地压测工具实操

Monin

高性能 压测 性能调优 #性能测试 wrk

Pytorch: autograd与逻辑回归的实现

timerring

人工智能

NFTScan 成为 Binance NFT 官方 NFT 数据提供商

NFT Research

NFT\ API 接口

云拨测全面升级丨单次拨测低至 0.001 元

阿里巴巴云原生

阿里云 云原生 可观测 云拨测

小白逆袭研发工程师 ——HDC.Cloud 2023华为云Astro分论坛

华为云PaaS服务小智

云计算 华为云 华为开发者大会2023

工业物联网协议对比:MQTT Sparkplug vs OPC-UA

EMQ映云科技

mqtt 工业物联网 opc sparkplug

Subquery? No, it's join!

Databend

九科三周年专访丨创始人万正勇:拥抱AIGC新浪潮,赋能信创产业高质量发展

九科Ninetech

那些不用js也能实现的效果

高端章鱼哥

CSS JavaScript html css3

从自研走向开源的 TinyVue 组件库

OpenTiny社区

开源 前端 组件库 OpenTiny TinyVue

了解 Apache JMeter 的使用方法

Liam

程序员 测试 Jmeter 接口测试 测试工具

TDengine 3.0.4.0 重要特性之 Python UDF 实战分享

爱倒腾的程序员

谈谈分布式事务

Monin

分布式事务 微服务 云原生 事务 java 编程

MegEngine 使用小技巧:如何使用 MegCC 进行模型编译

MegEngineBot

深度学习 开源 AI 模型编译器 模型编译器

喜讯!AntDB数据库入围上海信创公共服务平台产品目录

亚信AntDB数据库

数据库 AntDB AntDB数据库

Arthas深入学习

Monin

一辆没有“刹车”的跑车,你敢开多快?

原点安全

数据资产价值 数据安全管理 贴源保护

Python案例分析|科学计算和数据分析 | 社区征文

TiAmo

Python 数据分析 科学计算 年中技术盘点

protobuf 详解

快乐非自愿限量之名

protobuf

基于STM32的300W无刷直流电机驱动方案

元器件秋姐

驱动 无刷电机 直流电机 SMT32 FOC

科兴未来|2023“直通乌镇” 全球互联网大赛

科兴未来News

一道经典面试题:BeanFactory 和 FactoryBean 有何区别?

江南一点雨

spring

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