限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

构建更好的线程安全集合

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

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

关注

评论

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

无锡梁溪携手极视角共同举办2023无锡首届国际人工智能算法大赛

科技热闻

某乳品龙头企业,以精细化费用管理降低企业费效比

用友BIP

降本增效

【鸿蒙千帆起】《钢岚》成为首款基于HarmonyOS NEXT开发的战棋新游

HarmonyOS开发者

HarmonyOS

强大的音频格式转换工具:dBpoweramp Music Converter 激活最新

胖墩儿不胖y

Mac软件 音频格式转换器 音频格式管理

TF-IDF算法是什么呢?

小齐写代码

【堡垒机小问答】堡垒机最早起源于哪里?是国外吗?

行云管家

云计算 网络安全 堡垒机 云堡垒机

华为云开发者日,让开发者成为产业发展的决定性力量

华为云开发者联盟

开发者 华为云 华为云开发者联盟 华为云开发者日

Calico IPIP模式下的Cross Subnet特性分析

华为云开发者联盟

开发 华为云 华为云开发者联盟

位移贴图、凹凸贴图和法线贴图之间的差异

3D建模设计

3D渲染 材质纹理贴图 3D材质编辑

3D游戏角色建模纹理贴图处理

3D建模设计

3D渲染 材质纹理贴图 3D材质编辑

QCN9074 and QCN6274: Get through the fog of technology and choose your communication partner

wallysSK

Curve 如何演进 (1):从 EuroSys'23 CFS 论文看文件系统

OpenCurve

分布式 云原生 文件存储 分布式文件存储 分布式文件系统

java进行数据库操作的并发控制的2种方法

华为云开发者联盟

Java 数据库 后端 华为云 华为云开发者联盟

跨境通讯

cts喜友科技

通信 通讯

低代码技术特点揭秘:构建灵活安全的多租户数据生态

天津汇柏科技有限公司

低代码

S3 调用次数减少 98% | 探索 OpenDAL RangeReader 的奥秘

Greptime 格睿科技

数据库 时序数据 OpenDAL

泛互联网行业A/B测试全解析:产品优化的创新之道

字节跳动数据平台

大数据 ab测试 企业号12月PK榜 对比试验 数字化增长

法线贴图可以实现什么样的3D效果

3D建模设计

3D渲染 材质纹理贴图 3D材质编辑

低代码搭建工程项目管理方案:实现高效智能的数字化管理

天津汇柏科技有限公司

低代码

3D 建模中的法线贴图解释

3D建模设计

3D渲染 材质纹理贴图 3D材质编辑

PBR纹理贴图类型详解

3D建模设计

3D渲染 材质纹理贴图 3D材质编辑

不可避免,制造企业要在供应链“韧性”上下苦功

用友BIP

数智采购

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