写点什么

构建更好的线程安全集合

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

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

关注

评论

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

Redis stream Java API实践

FunTester

Sealem Finance打造Web3去中心化金融平台基础设施

BlockChain先知

锁机制

卢卡多多

锁机制 6月月更

flutter系列之:UI layout简介

程序那些事

flutter 程序那些事 6月月更

APICloud可视化开发丨一键生成专业级源码

YonBuilder低代码开发平台

App 低代码 可视化 APICloud 移动端开发

APICloud可视化开发新手图文教程

YonBuilder低代码开发平台

App APICloud 低代码开发 移动端开发 可视化开发

Vue-5-模板语法-2

Python研究所

前端 6月月更

搭建在线帮助中心,轻松帮助客户解决问题

小炮

攻防演练 | 网络安全“吹哨人”:安全监控

青藤云安全

网络安全 主机安全 攻防演练

如何使用物联网低代码平台进行工作表管理?

AIRIOT

低代码 物联网 低代码开发平台

存储引擎分析

工程师日月

6月月更

改变世界的开发者丨玩转“俄罗斯方块”的瑶光少年

华为云开发者联盟

人工智能 华为云 俄罗斯方块

ServerLess Aws Lambda攻击与横向方法研究

火线安全

云安全

很流行的状态管理库 MobX 是怎么回事?

岛上码农

flutter ios 安卓开发 跨平台开发 6月月更

Tornado简介&&本专栏搭建tornado项目简介

孤寒者

Python tornado 6月月更

推开混合云市场大门,Lenovo xCloud的破局之道

脑极体

【愚公系列】2022年06月 面向对象设计原则(五)-接口隔离原则

愚公搬代码

6月月更

APICloud 5月SDK发版说明

YonBuilder低代码开发平台

App 低代码 APICloud 可视化开发

云数据中心中的SDN/NFV应用

穿过生命散发芬芳

SDN网络 6月月更

【6.3-6.10】精彩博文回顾

InfoQ写作社区官方

优质创作周报

leetcode 130. Surrounded Regions 被围绕的区域(中等)

okokabcd

LeetCode 搜索 数据结构与算法

为什么要开发分布式操作系统

LAXCUS分布式操作系统

分布式计算 分布式存储 超算 云边端协同 分布式操作

华为云鲲鹏DevKit代码迁移实战

乌龟哥哥

6月月更

2022 年 DevOps 路线图|Medium

观测云

Web3生态去中心化金融平台——Sealem Finance

西柚子

Flutter在数字生活的发展与天翼云盘落地实践

flutter 架构 混合应用开发 移动开发 客户端

一文带你了解J.U.C的FutureTask、Fork/Join框架和BlockingQueue

华为云开发者联盟

Java 开发 华为云

首批!青藤通过信通院CWPP能力评估检验

青藤云安全

网络安全 主机安全 信通院

Java—基础容器

武师叔

6月月更

数据的软删除—什么时候需要?又如何去实现?

Geek_rze78a

6月月更

Spark ShuffleManager

Geek_qsftko

大数据 spark

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