2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

C#中安全并行机制的唯一性和引用不可变性研究

  • 2012-12-20
  • 本文字数:1141 字

    阅读完需:约 4 分钟

近来,微软、微软研究院和华盛顿大学的不少知名人士正在对 C#中的新变量类型进行研究。该变量类型引入了语言级别上的可读性和不可变引用(immutable references)的概念。这意味着每种引用有四种权限的限定符,这些限定符会修改变量和参数。

C#中的普通引用是“可写(writable)”权限。这表示引用所指向的对象可以用普通的方法和属性设置进行修改。

下一种限定符是“可读(readable)”权限。可读引用是对象的一种只读视图。在这种权限下你还是可以修改对象,只是不能用特殊的引用方式进行修改。

如果任何一种引用都无法修改某对象,那么这种引用就称作为“不可变(immutable)”。不可变引用也被称作只读引用,不可变引用所指向的所有对象都是不可变的。

最后一种权限限定符叫做“隔离(isolated)”,表示“对外部唯一对象簇的外部引用”。这是个相对复杂的概念。想象一下,在某个图表中你有一些可变对象,你能够通过简单或复杂方法引用,但是你不能在图表之外直接引用这些对象。除非这个对象是根聚集,这是一种例外。研究中的图 1 也许能更清楚地表示这种限定符:

很多研究集中探讨了对象如何在这四种限定符之间进行转换。这个概念在创建复杂、不可变的对象图表中至关重要。在传统的功能性编程语言当中,程序自下而上地创建不可变对象图表。由于对开发语言的依赖,这使得内部循环变得困难甚至不可行。这还可能造成性能下降,特别是当开发过程中的叶节点需要进行修改时。

而在新模式下,对象图表首先从可变对象中创建,正如传统的面向对象编程风格的图表。被标记成“隔离”的单个变量去引用根图表。之后你可以用函数将变量所对应的值从“隔离”T 转换成“不可变”T,以达到“恢复不可变性”的作用。(谨记,“隔离”和“不可变”是变量类型的限定符,而非它们所引用的对象类型。)

这样做的主要原因在于,这让我们可以使用更安全的并行机制。编译器能够通过权限的限定符来判断程序是否安全地访问对象,并且不会引入竞争条件。尽管这样做无法彻底地消除死锁,但至少能够减少死锁的频率。

这种设计还开启了优化编译器及执行环境的新途径。

比如对不可变数据,并发的垃圾回收可以使用更灵活的可读边界。编译器变得更支持 Code Motion 以及缓存,并支持通过 MSIL-to-native 传递将不可变数据保留为二进制方式。

Colin S. Gordon、Matthew J. Parkinson、Jared Parsons、Aleks Bromfield 和 Joe Duffy 共同撰写了《安全的并行机制的唯一性和不可变性引用》。

查看英文原文: Research into Uniqueness and Reference Immutability for Safe Parallelism in C#


感谢侯伯薇对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-12-20 04:322151

评论

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

【jquery Ajax】基础概念与使用教学

坚毅的小解同志

ajax 11月月更

云原生社区 Meetup 长沙站开始报名!

腾源会

云原生

【jquery Ajax 】art-template模板引擎的概念与使用

坚毅的小解同志

jquery ajax 11月月更

大数据培训学习后没有面试机会怎么办

小谷哥

【Node.js】模块化学习

坚毅的小解同志

node.js 11月月更

大数据的5V特征分别是什么?

好程序员IT教育

大数据 V5

【jquery Ajax 练习】图书管理

坚毅的小解同志

ajax 11月月更

【jquery Ajax】接口的学习与Postcode插件的使用

坚毅的小解同志

ajax 11月月更

教育行业数据可视化应用方案与实践

葡萄城技术团队

前端 数据可视化 智慧医疗 智慧工程

还不会正则表达式? 放心 我会出手(万字教学)

坚毅的小解同志

正则表达式 11月月更

【jquery Ajax 】art-template模板引擎案例——新闻列表

坚毅的小解同志

ajax 11月月更

我服了!SpringBoot升级后这服务我一个星期都没跑起来!(下)

艾小仙

Java spring springbot

OH应用程序集成AGC认证服务实现邮箱登录

白晓明

OpenHarmony AGC认证服务

云原生技术中台 CNStack2.0 正式发布

阿里巴巴云原生

阿里云 云原生 CNStack 云原生中台

java就业方向有哪些?

小谷哥

【Node.js练习】web服务器案例

坚毅的小解同志

node.js 11月月更

【Node.js】npm与包【万字教学~超超超详细】

坚毅的小解同志

node.js 11月月更

Linux 系统目录结构

芯动大师

Linux tar 11月月更 Linux目录

Meta force2.0佛萨奇矩阵公排系统开发合约部署搭建

开发微hkkf5566

干货|无源元件之——电阻器基础知识(超全)

元器件秋姐

盘点 | 云原生峰会重磅发布

阿里巴巴云原生

阿里云 云原生

曳影1520已成功运行Anolis OS!详聊平头哥在RISC-V软件生态的探索和实践 | 龙蜥技术

OpenAnolis小助手

操作系统 芯片 risc-v 龙蜥峰会 平头哥

大数据培训和自学怎么学习

小谷哥

数据报告 | 新冠疫情对美国民众消费行为的影响

前嗅大数据

疫情 数据分析 爬虫 数据采集 消费

无序和混乱终结者,极狐GitLab Workflow 到底有什么魔力?

极狐GitLab

DevOps Code Review CI/CD workflow 极狐GitLab

【jquery Ajax 】form表单教学+评论案例

坚毅的小解同志

11月月更

前端培训和自学的哪种方式更合适?

小谷哥

eBPF程序摄像头——力争解决可观测性领域未来最有价值且最有挑战的难题

KINDLING

Java Linux 监控 可观测 #ebpf

【区块链Go】基础语法

坚毅的小解同志

#go 11月月更

【Node.js】模块的加载机制

坚毅的小解同志

node.js 11月月更

西安java培训学习有哪些方法?

小谷哥

C#中安全并行机制的唯一性和引用不可变性研究_C#_Jonathan Allen_InfoQ精选文章