写点什么

构建更好的线程安全集合

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

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

关注

评论

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

于雨荣获 2022 年度 "OSCAR 尖峰开源人物"

apache/dubbo-go

[力扣] 剑指 Offer 第一天 - 包含min函数的栈

陈明勇

Go 数据结构与算法 力扣 11月月更

5.图学习【参考资料2】-知识补充与node2vec代码注解

汀丶人工智能

图神经网络 11月月更

李白:你的模型权重很不错,可惜被我没收了

OneFlow

人工智能 深度学习 模型

CANN 6.0来了,硬核技术抢先看

华为云开发者联盟

人工智能 华为云 昇腾 CANN 6.0

Java Web(十一)Ajax&Axios&JSON

浅辄

json ajax javaWeb axios 11月月更

一文彻底读懂webpack常用配置

Geek_02d948

webpack

万物互联,合作共赢:中国物联网行业发展洞察2022

易观分析

物联网 报告

python小知识-python 文件操作

AIWeker

Python python小知识 11月月更

亚洲合作资金项目“上合国家软件产业和数据治理合作论坛”在京召开

Geek_2d6073

云管平台厂家联系方式谁有?咨询电话多少?

行云管家

云计算 云服务 企业上云 云管平台 云资源

细说React组件性能优化

xiaofeng

React

深度剖析React懒加载原理

xiaofeng

React

python小知识-模块

AIWeker

Python python小知识 11月月更

深度探讨react-hooks实现原理

xiaofeng

React

webpack高级配置

Geek_02d948

webpack

前端食堂技术周刊第 59 期:GitHub Universe 2022、Rome v10、Parcel v2.8.0、可扩展的 CSS 演变、Solid Start Beta

童欧巴

CSS vim Github Action

爱了!阿里技术官亲笔的Java快速面试指南,熬夜啃完剑指大厂

程序知音

Java java面试 java架构 后端技术 Java面试八股文

如何通过Java代码压缩PDF文档?

在下毛毛雨

Java PDF 压缩PDF

高频量化合约对冲交易软件开发源代码

开发微hkkf5566

StarRocks 技术内幕 | 多表物化视图的设计与实现

StarRocks

数据库 数据分析

国有银行发挥普惠金融“头雁”效应,业务成果领跑商业银行

易观分析

普惠金融

智慧物流数字孪生系统

申扬科技

智慧物流 数字孪生

wallys-WiFi-5-outdoor-Access-point-IPQ4019/4029-industrial wireless AP

Cindy-wallys

IPQ4019 ipq4029

Prometheus 监测 RocketMQ 最佳实践

Apache RocketMQ

RocketMQ #java #运维 消息序列

白嫖一款免费的GIF录制软件,好用到飞起,萌新小白装机必备。

bug菌

GIF gif录制 视频录制

webpack配置完全指南

Geek_02d948

webpack

大麦 Android 选座场景性能优化全解析

阿里巴巴终端技术

android 性能优化 客户端

Java Web(十)Filter和Listener

浅辄

javaWeb filter listener 11月月更

HA软件是做什么的?主要作用是什么?

行云管家

高可用 ha 双机热备

瓴羊Quick BI,自助式报表分析工具让企业运营更高效

巷子

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