写点什么

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

评论

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

生产者与消费者模式,数组阻塞队列(ArrayBlockingQueue)

李尚智

Java 学习 架构 并发编程

Volcano架构设计与原理介绍

华为云原生团队

大数据 AI 云原生 高性能 批量计算

在数据分析、挖掘方面,有哪些ETL工具值得推荐?

敏捷调度TASKCTL

大数据 kettle 海豚调度 批量任务 ETL

当音乐学博士搞起编程...

程序猿DD

Spring Frame

“反垄断”来袭,对产业区块链有什么启发

CECBC

市场垄断

不同公司产品经理岗位对比

LouisN

Soul 网关源码阅读(二)代码初步运行

Java 源码阅读 网关

Soul 网关源码阅读(四)Dubbo请求概览

Java 源码阅读 网关

一文解析DDD中台和微服务设计

欧创新

中台 微服务 领域驱动设计 DDD

用AI「驯服」人类幼崽,手头有娃的可以试试

博文视点Broadview

人工智能 联邦学习 强化学习 集成学习 技术宅

即构小程序直播组件集成教程

ZEGO即构

为什么我认为 Deno 是一个迈向错误方向的 JavaScript 运行时?

hylerrix

typescript rust nodejs deno V8

从CPU到XPU进化,英特尔对业界放了什么大招?

E科讯

Soul 网关源码阅读(一) 概览

Java 源码阅读 网关

智能量化对冲搬砖套利交易软件APP系统开发

系统开发

一文带你探究Sentinel的独特初始化

华为云开发者联盟

redis sentinel 框架

区块链科普系列:区块链是什么?

CECBC

区块链

架构师训练营W13作业

Geek_f06ede

物流快递公司APP架构设计

jorden wang

初识ClickHouse——安装与入门

Simon

Clickhouse

Soul 网关源码阅读(三)请求处理概览

Java 源码阅读 网关

DevSecOps安全检查清单

啸天

安全 DevSecOps 应用安全

「产品经理训练营」第一章作业

Sòrγy_じò ぴé

产品经理训练营

敏捷里为何倡导固定迭代周期?

万事ONES

敏捷开发 研发管理 迭代

面试阿里Java岗,技术总监真正关心的核心能力是什么?

Java架构追梦

Java 编程 架构

解读容器的 2020:寻找云原生的下一站

阿里巴巴云原生

Docker 云计算 Serverless 容器 云原生

区块链十年与传统金融的变化

CECBC

区块链 金融

矿机挖矿APP系统模式开发平台

v16629866266

特斯拉自建ERP的背后

明道云

Java 程序经验小结:剖析@SuppressWarinings注解

后台技术汇

28天写作

iOS性能优化 — 五、App启动优化

iOSer

ios 性能优化 性能分析

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