写点什么

枚举并发集合探讨

  • 2008-09-03
  • 本文字数:1288 字

    阅读完需:约 4 分钟

.NET 的并行扩展(Parallel Extensions)包括两个并发集合:堆栈和队列。其他集合类还是按照它们固有的方式工作,但是对于语义的处理依然有一些挥之不去的问题。尤其是当集合在一个线程被编辑,而在另外一个线程被枚举的时候,会发生什么呢?

对于单线程的类,答案是众所周之的,枚举器将抛出一个异常。不过对于并发类来说,在这种情况下应该设定一种规则,提供几种选择。

一种选择是,在枚举开始的时候为现存数据创建一个快照。这种方式在循环的过程中会占用更多的内存,不过快照一旦被创建,就可以被自由地锁定。这种方式下隐含的性能问题很难被预估。

不使用快照,集合还有一组保证措施提供给开发人员。它们中很多都是自相矛盾的,不过在某些条件下它们也都是适合的。

  • 删除的条目总是可读
  • 删除的条目不可再读
  • 如果添加在集合的末尾,那么添加的条目总是可读
  • 如果添加在集合的任何地方,那么添加的条目总是可读
  • 添加的条目总是不可读取
  • 被移动的条目,不能被读取两次
  • 被移动的条目,如果是移动到集合的末尾,那么就能被读取两次
  • 被移动的条目,就算是被移动到集合的开头,也总是可以读取
  • 不超过 N 条的条目就能被读取,而 N 是集合的初始大小。

在给出一个选择范围后, Stephen Toub 向大家征询关于并行扩展的反馈意见

  1. 鉴于在.NET 中已经存在一些标准的集合类了,假如你已经具有它们的线程安全(thread-safe)版本,那么什么样的情形下,你才可以从能并发地枚举同一个被其它线程同时编辑的集合中获得好处?我们虽然对此已经有所了解,不过还是很想多听听大家的意见。
  2. 假设你确实具有第一条提到的情形,那么为了让从枚举器中返回的数据是可用的,你大概需要的最小保证措施是什么?例如,对于一个字典对象如果不存在并发编辑(添加 / 更新 / 删除),你可以认为它是线程安全的,你将能在枚举过程中准确地得到字典中的内容;然而,如果存在并发访问,你再也不能得到已经不存在于字典中的内容,你可能看不到并发添加或更新的东西,也可能依然能看到那些被并发地删除的条目。
  3. 如果我们确实支持在线程安全的集合上进行面向并发编辑的枚举操作,那么你希望能够从“在并发编辑上抛出异常”这样的行为中恢复之前的操作吗?
  4. 最后,你期望看到的既线程安全又能实现可伸缩副本的集合中,哪个最重要?

Omer van Kloeten 对于序列化,提出了一个重要的问题,

一个重要的附加功能是能够异步地转储(dump),即有时为了备份可以把内存的数据缓存到持久性存储,这就要求线程安全的枚举过程。(实际上,想一想——是否也能线程安全地序列化?这样的话什么才是默认的行为呢?)

Rick Brewster 则建议我们求助于函数式编程概念。代替在外部锁定集合的方式,所有对集合的并发操作都能通过给“Lock(Action)”方法传递一个委托来执行。

这个点子就是让“Lock”方法自动地用 lock/unlock 这样的结构把你的回调包围起来。这种方法也不会限制你使用这些类当前已经暴露出来的原子操作。实际上,也许让 Lock 来获得 Func 而非 Action 更好,并且 ConcurrentList 类本身不真正具有任何用于 get、set、enumerate 的方法。使用这种方式,你就只能访问在锁定范围内的类。

查看英文原文: Enumerating Concurrent Collections

2008-09-03 20:041280
用户头像

发布了 254 篇内容, 共 71.4 次阅读, 收获喜欢 2 次。

关注

评论

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

阿里内网最新发布“M8”级Java面试笔记,助力金九银十

程序员啊叶

Java 编程 程序员 架构 java面试

《SpringBoot 手册》:国际化组件 MessageSource

看山

springboot MessageSource

干货来袭!2022阿里巴巴全新出品Spring全家桶全栈笔记(终极版)奉上

程序员小毕

Java spring 程序员 面试 微服务

蓦然回首,“工厂、构造、原型”设计模式,正在灯火阑珊处

掘金安东尼

JavaScript 前端 7月月更

如何写一份高可读性的软件工程设计文档

C++后台开发

数据库 软件工程 后端开发 C/C++后台开发 C/C++开发

六面蚂蚁金服,唬住了面试官要了30K;其实Java面试也没那么难

程序知音

Java 程序员 后端技术 秋招 Java面试八股文

我给大家免费公开五份阿里Java架构师学习手册!助力金九银十

程序猿阿宇

架构 Java 面试 大厂面试 大厂技能 秋招

只分享这一次!阿里软件架构师深入底层手写JDK源码

程序猿阿宇

架构 Java 面试 大厂技能 后端技术 秋招

大厂面试突击必备:“网络编程”高频八连击,扛得住吗?

程序员啊叶

Java 编程 程序员 架构 java面试

手慢无!阿里亿级流量高并发系统设计核心原理全彩笔记现实开源

Java全栈架构师

Java 面试 程序人生 分布式锁 架构师

五面阿里,终拿offer,不明白为什么面试官总喜欢问Java这种问题

程序知音

Java 阿里 后端技术 八股文 Java面试八股文

想用K8s,还得先会Docker吗?其实完全没必要

程序员啊叶

Java 编程 程序员 架构 java面试

Kubernetes应用管理深度剖析

Bob

云原生 容器化 后端技术 Kubernetes 集群

上天入地Hadoop——使用高性能分布式技术完成大数据处理任务

程序猿阿宇

大数据 架构 Java 面试 java程序员 编程、

CMake库搜索函数居然不搜索LD_LIBRARY_PATH

华为云开发者联盟

后端 开发

腾讯被裁,转头去字节!Java后端核心面试题在手,怎能进不去大厂

程序员啊叶

Java 编程 程序员 架构 java面试

SMI 与 Gateway API 的 GAMMA 倡议意味着什么?

张晓辉

Kubernetes 服务网格 SMI

4位资深专家多年大厂经验分享出Flink技术内幕架构设计与实现原理

程序员啊叶

Java 编程 程序员 架构 java面试

备战金九银十,两份JAVA面试题2022最新整合版,祝你脱颖而出

王小凡

Java MySQL spring 面试 springboot

十月阿里社招Java面试题:数据库+分布式+高并发+JVM+Spring

程序知音

Java 阿里巴巴 程序员面试 后端技术 八股文

一文读懂Elephant Swap,为何为ePLATO带来如此高的溢价?

鳄鱼视界

数据中台建设(五):打破企业数据孤岛和提取数据价值

Lansonli

数据中台 7月月更

时序数据库在船舶风险管理领域的应用

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

HarmonyOS分布式协同演奏技术实现路线(Java)

程序员啊叶

Java 编程 程序员 架构 java面试

京东发布这份SpringBoot实战手册带你从0手动搭建企业级商城项目

程序猿阿宇

程序员 面试 java程序员 Spring Boot CLI 秋招

难道Redis真的变慢了吗?

程序员啊叶

Java 编程 程序员 架构 java面试

真香!180页100+题15W+字解析的《Java高级面试指南》,果断收下

程序员啊叶

Java 编程 程序员 架构 java面试

Moonbeam创始人解读多链新概念Connected Contract

One Block Community

区块链

[ Kitex 源码解读 ] 熔断机制是如何实现的

baiyutang

Go 微服务 微服务架构 kitex CloudWeGo

太牛了,百度这份开发手册几乎涵盖了Spring Cloud所有操作

程序猿阿宇

架构 java程序员 java面试 秋招 程序员‘

枚举并发集合探讨_.NET_Jonathan Allen_InfoQ精选文章