时隔16年JeffBarr重返10.23-25 QCon上海站,带你看透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:281922
用户头像

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

关注

评论

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

运维审计系统是堡垒机么?跟堡垒机有啥区别?

行云管家

运维 堡垒机 运维审计系统

母婴后浪品牌频出,各个细分市场有哪些发展潜力?

易观分析

母婴

“StarRocks 极客营” 重磅来袭,和技术大牛一起推开数据库梦想之门!

StarRocks

数据库 大数据 StarRocks

恒源云(GpuShare)_MaskFormer:语义分割可以不全是像素级分类

恒源云

语义分割 像素分割 MaskFormer

收藏很久的资源整合网站,一个网站一个世界

小炮

从 SVN 迁移到极狐GitLab

极狐GitLab

svn 迁移 极狐GitLab

教你两分钟做出一个精美好用的404页面

源字节1号

前端开发 后端开发 网页开发

TDesign 更新周报(2022年3月第3周)

TDesign

一周热点回顾|虎符交易所上线多链合一;俄央行称加强监控加密资产等P2P交易

区块链前沿News

区块链 虎符交易所

centos7.6安装MySQL5.7采坑指南

云原生

MySQL 数据库 sql centos

深入浅出事务的本质,附 OceanBase 事务解析14问!

OceanBase 数据库

oceanbase OceanBase 社区版

如何进行高效的版本管理,版本管理的方法

阿里云云效

云计算 阿里云 项目管理 云原生 版本管理

在线JSON转HTML,TABLE表格工具

入门小站

工具

小程序容器轻松打造轻应用生态平台

Speedoooo

APP开发 小程序容器 轻应用 快应用 超级app

集结创新力量,2022航天宏图&华为云杯PIE软件开发者大赛正式开启

科技热闻

【网络安全】网络安全的重要性你知道吗?

行云管家

网络安全

在线HTML压缩格式化工具

入门小站

工具

Centos7安装Nginx

云原生

nginx centos 部署

电脑就是我的安全感|ONES 人物

万事ONES

招聘 软件工程师

数字化原住民|ONES 人物

万事ONES

软件 招聘 软件工程师

OceanBase 源码解读(八):事务日志的提交和回放

OceanBase 数据库

oceanbase 源码解读

成都大运会“数智竞技邀请赛”启动 开悟平台为全球青年提供竞技舞台

科技热闻

VuePress 博客之 SEO 优化(五)添加 JSON-LD 数据

冴羽

Vue 前端 vuepress SEO 博客搭建

什么技术,让浩鲸科技拿下中国移动大奖?

鲸品堂

中国移动

敏捷实践|好的用户故事怎么写?

LigaAI

用户故事 敏捷实践

Git 如何回退代码

秋天

聊聊数仓中TPCD-DS&TPC-H与查询性能的那些事儿

华为云开发者联盟

编辑器 GaussDB(DWS) TPCD-DS TPC-H 查询性能

大咖说|试衣到家 CEO:我们卖的不是衣服,是服务

大咖说

阿里巴巴 科技 时尚产业 试衣到家

3. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识bombardierdate

MASA技术团队

C# .net 测试 压测 测试工具

Linux之uniq命令

入门小站

Linux

小程序容器技术,App热更新与敏捷开发新方案

Speedoooo

敏捷开发 APP开发 热更新 小程序容器 动态更新

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