写点什么

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:321987

评论

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

百度BaikalDB在同程艺龙的成功应用实践剖析

百度Geek说

数据库 架构 后端

从0开始的TypeScriptの三:TS的类型

空城机

typescript 大前端 8月日更

netty系列之:基于流的数据传输

程序那些事

Java Netty nio 程序那些事

同为电动小车热门,欧拉白猫比拼零跑T03,谁更胜一筹?

科技热闻

索信达控股:打造新一代中小银行智能营销平台体系的道与术

索信达控股

【LeetCode】0~n-1中缺失的数字Java题解

Albert

算法 LeetCode 8月日更

Vue进阶(二十一):ES6 知识储备

No Silver Bullet

Vue ES6 8月日更

BERT模型为什么这么强?

博文视点Broadview

生产环境全链路压测平台Takin

TakinTalks稳定性社区

开源 高可用 全链路压测 性能压测

带你了解Go怎样实现二级缓存

Regan Yue

redis 二级缓存 Go 语言 8月日更

当 CloudQuery 遇到大数据

BinTools图尔兹

大数据 hive ES 数据库管理

探究Presto SQL引擎(1)-巧用Antlr

vivo互联网技术

sql 编译器 presto antlr4

四色建模:用户转化率 KPI

escray

学习 极客时间 如何落地业务建模 8月日更 四色建模

手撸二叉树之最小深度

HelloWorld杰少

数据结构与算法 8月日更

“互联网+”大赛之AI创新应用赛题攻略:大胆脑洞,共绘智慧生活蓝图

华为云开发者联盟

AI HarmonyOS 大赛 互联网+ HMS Core

淘宝杨宽:淘宝直播低延迟架构演进和实践丨ECUG Meetup 回顾

七牛云

音视频 淘宝 ECUG 七牛云

Apache APISIX 在移动云的应用

API7.ai 技术团队

开源 网关 APISIX

WeLink的杀手锏和远程办公软件的另一面

华为云开发者联盟

远程办公 华为云 welink 视频会议 数字化办公

Druid 加载 Kafka 流数据 Supervisor 配置

HoneyMoose

oeasy教您玩转vim - 12 - # 词头词尾

o

书单 | 振聋发聩,撼世经典!总有那么一些书经得住时间的考验

博文视点Broadview

百度大脑DuMix AR携明星数字员工首次亮相China Joy,智能虚拟形象系统全面升级

百度大脑

人工智能 ChinaJoy 虚拟偶像 数字人

docker入门:单机elasticsearch安装记录,保证无坑

小鲍侃java

8月日更

【Vue2.x 源码学习】第三十一篇 - diff算法-比对优化(下)

Brave

源码 vue2 8月日更

【Flutter 专题】71 图解基本隐式动画 Widget

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

十大排序算法--基数排序

Ayue、

排序算法 8月日更

Prometheus 监控SpringCloud微服务

Rubble

Prometheus SpringCloud 8月日更

破解三大安防视频痛点,看华为4大硬核视频上云技术

华为云开发者联盟

视频 华为云视频 安防 摄像头 安防视频

Python代码阅读(第8篇):列表元素逻辑判断

Felix

Python 编程 Code Programing 阅读代码

网络攻击的高频出现,高防服务器是最佳的选择

九河云安全

Vue进阶(二十三):Promise 详解

No Silver Bullet

Vue Promise 异步请求 8月日更

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