AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

构建更好的线程安全集合

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

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

关注

评论

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

Google官方bazel构建工具的安装

Changing Lin

8月日更

netty系列之:自建客户端和HTTP服务器交互

程序那些事

Java Netty 程序那些事

SharingSphere 源码解析 -- 真实SQL生成探索

数据库 源码

数字化时代商业银行客户触达策略研究 从数据到服务 由场景到生态

CECBC

中证协组织专题座谈会,加快推进区块链技术在证券行业应用

CECBC

快手平台严管售卖“仿黄金类饰品”,直播带货在收割消费者

石头IT视角

微信开源C/C++ RPC框架PhxRPC

OpenIM

新时代大视频产业的底座,视频云创变了什么?

阿里云CloudImagine

阿里云 直播技术 视频制作 视频流 视频云

疫情下的人生百态

6979阿强

图计算 GraphScope 新冠

百分点大数据技术团队:BI嵌入式分析实践

百分点科技技术团队

BI 百分点科技 嵌入式分析

网络攻防学习笔记 Day122

穿过生命散发芬芳

网络安全 8月日更

ipfs矿机是什么?ipfs矿机挖出的币能交易吗?

区块链 分布式存储 ipfs挖矿 ipfs矿机 filecoin挖矿

webrtc 即时带宽评估器(BitrateEstimator)

webrtc developer

WebRTC

分享 10 个高星的创意项目!

程序员鱼皮

Java Python 数据库 大前端 Go 语言

不用手机,如何让猫给你打视频电话丨日常小技

声网

物联网 目标检测 目标跟踪

架构设计-模块一

逝水流

架构

GitHub获120w+star的JDK源码剖析手册,竟出自Alibaba高管之手?

Java 架构 面试 程序人生 Alibaba

融云 X-Live 系列直播启动,遇见通信的无限可能

融云 RongCloud

开发者 音视频 通信 融云 即时通信

百分点感知智能实验室:语音识别技术发展阶段探究

百分点科技技术团队

语音识别 百分点科技 感知智能

区块链技术发展趋势与银行业探索实践

CECBC

架构实战营模块1作业

^_^

架构实战营

程序员应该专注技术还是转管理?

石云升

职业规划 职场经验 8月日更

细思极恐!Alibaba新产SpringBoot深度历险(嵩山版)开源

Java 编程 架构 面试 架构师

区块链盲盒游戏app软件开发|盲盒游戏软件介绍

量化系统19942438797

区块链 智能合约 盲盒

Tapdata Cloud 版本上新!率先支持数据校验、类型映射等6大新功能

tapdata

MySQL nosql schema

我遇到的那些工长

escray

生活记录 8月日更

跨越AI天堑时:行动代号“盘古大模型”

脑极体

读书笔记 -《数据密集型应用系统设计》- 数据编码

KayTin

算法毕业总结

Geek_Gu

AlphaFold2“登陆”北鲲云平台,云计算助力科研大放异彩

北鲲云

模块1-作业

笑看风雨情

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