写点什么

构建更好的线程安全集合

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

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

关注

评论

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

从稳定性、响应速度、可用率全面测试行业标杆罗拉ROLA-HTTP代理

Geek_bf375d

罗拉rola-ip详解长效代理IP和短效代理IP的区别是什么?

Geek_bf375d

WorkPlus私有化部署的即时通讯软件,企业内部沟通协作的利器

BeeWorks

客户削减项目开发预算,试试华为云这款轻量应用服务器保质保量

YG科技

低代码自动化,程序员真的还有前途吗??

代码生成器研究

罗拉ROLA告诉你如何正确、合理使用静态IP代理?

Geek_bf375d

WorkPlus Meet视频会议系统,可私有化部署,保障内部数据安全

BeeWorks

CSS选择器

阡陌r

CSS 选择器 伪元素 伪类

基于javacv的人脸识别和图片内容审核方案

智慧源点

人脸识别 内容审核

为什么开发不能兼任测试?普通人不知道的冷知识指南

代码生成器研究

WorkPlus AI助理知识问答机器人,助力企业级私有化AI构建

BeeWorks

解锁数据潜力:为什么你应该考虑使用向量数据库

熬夜磕代码、

数据库

大语言模型|人工智能领域中备受关注的技术

许思王

人工智能 大语言模型

C语言与C++语言混合编程的方法

王玉川

c 混合编程 C++

新一轮SocialFi浪潮来袭,Atem Network 再次打响注意力争夺战

股市老人

ETL数据转换工具类型与适用场景

RestCloud

ETL

如何快速将钉钉员工信息同步到飞书

RestCloud

双11终极之战,华为云耀云服务器L实例点燃狂欢高潮

YG科技

从DPlayer说起,有哪些开源的H5播放器

魂祈梦

前端 js

Linux设备树(DTS)

芯动大师

Linux

外贸网站预算持续削减,这个轻量应用服务器搞定老板

YG科技

不会写代码了?2分钟看完,这5个技巧你一定要收好。

代码生成器研究

无代码/低代码编程是否走错了路?

代码生成器研究

是效率利器还是程序黑盒?为什么程序员都抵制低代码?

代码生成器研究

IP长效代理,稳定、高效网络罗拉rola-ip代理服务

Geek_bf375d

罗拉rola-ip带你看使用代理IP时有哪些小技巧?

Geek_bf375d

容器中sh脚本明明存在,为何会报"no such file or directory"的错误?

大伟

git Docker autocrlf

彩虹桥架构演进之路-性能篇

得物技术

数据库 nio 中间件 高性能

推出链上美债产品的 ProsperEx:RWA 衍生品赛道的早期玩家

股市老人

『亚马逊云科技产品测评』活动征文|如何使用Docker compose快速搭建个人博客?

鸽芷咕

Docker 容器 云服务器

小程序开发经费紧张,华为云这份省钱秘笈请点赞收藏

YG科技

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