【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

评论

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

Nginx配置80端口用于多个域名

石云升

nginx 域名配置 80端口共用

低/零代码平台的优点有哪些?

代码制造者

编程语言 低代码 零代码 信息化 编程开发

CentOS 7 配置Supervisor 服务遇到的坑总结

BigYoung

centos 报错 Supervisor

彻底解决雪花算法时间回拨问题新方案

柿子

算法 雪花算法

同行分析优化

誓约·追光者

Sparksql 优化

linux入门系列4--vi/vim编辑器

黑马腾云

vim Linux centos7 操作系统 VI

吐血整理Windows电脑入侵自检大全

BigYoung

黑客 windows 日志 异常 自检

Mac JetBrains(IDE)常用快捷键

王坤祥

JetBrains 快捷键

「分布式一致性协议」从2PC、3PC、Paxos到 ZAB

大头星

lgloo Software 的 Jira Cloud 转型之旅

Atlassian

项目管理 DevOps 敏捷开发 Jira Cloud

LeetCode题解:88. 合并两个有序数组,双指针+从后往前,JavaScript,详细注释

Lee Chen

大前端 LeetCode

Linux入门系列1--环境准备及Linux安装

黑马腾云

Linux centos 运维 操作系统

linux入门系列3--常见的linux远程登陆管理工具

黑马腾云

Linux xshell securecrt putty finallshell

不懂 ZooKeeper?没关系,这一篇给你讲的明明白白

大头星

Java zookeeper 分布式

Django 表单处理流程详解

BigYoung

django 表单 流程

CIC国信公链:做坚实的底层技术支撑,让区块链为现代农业插上腾飞的翅膀

CNG农业公链

区块链 农业发展 CIC国信公链 CNG农业链 赵其刚

定义“开发者关系”

开发者关系

开发者关系 开发者运营 技术运营 开源社区

开发者关系(DevRel)的新手指南

开发者关系

开发者关系 开发者运营 技术运营 开源社区

话题讨论 | 特斯拉和拼多多杠上了,你有什么看法?

InfoQ写作社区官方

写作平台 话题讨论

linux入门系列5--新手必会的linux命令

黑马腾云

Linux centos7 Shell linux命令 linux操作

随着区块链技术的成熟,全球企业开始拥抱公共区块链

CECBC

区块链技术 公共区块链

9个典型的开发者关系面试题

开发者关系

开发者关系 开发者运营 技术运营 开源社区

Linux数据流重定向

王坤祥

Linux linux操作

十年磨一剑-BIGO全球音视频技术解决方案

InfoQ_3597a20b53cc

人工智能 大数据 技术

Django2.x中url路由的path()与re_path()参数解释

BigYoung

django path url re_path 参数

RPC原理

石刻掌纹

Linux之crontab命令

王坤祥

Linux crontab

linux入门系列2--CentOs图形界面操作及目录结构

黑马腾云

Linux centos7 操作系统 系统运维

Windows AD巡检报错处理

BigYoung

windows AD 报错 巡检

跟我一起基于Karma搭建一个测试环境(上)

Jack Q

大前端 Karma 测试框架搭建

物流与区块链加供应链的现状与未来趋势

CECBC

行业资讯 区块链技术 供应链

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