写点什么

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

评论

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

【数据结构与算法】“堆”还能这样用_堆的应用

Dream-Y.ocean

面试 9月月更

【中秋特辑-代码解析月饼节】C++比C语言更加规范、方便?是因为增加了如下特性 | C++98 & C++11 | C++难学?带领大家一步一步深度剖析 | 简单易懂

Dream-Y.ocean

c++ 底层 细节 9月月更

HowTo:Pipy 如何修改请求和响应的内容

Flomesh

Service Mesh 服务网格

2022华为开发者大赛开学动员 开启想象力无限创新

华为云开发者联盟

云计算 后端 企业号九月金秋榜

原生Redis跨数据中心双向同步优化实践

京东科技开发者

数据中心 幂等性 同步 数据容灾 Redis 数据结构

必修课!深度解析金融级分布式数据库一致性技术

腾讯云数据库

数据库 腾讯云 tdsql 腾讯云数据库

【数据结构与算法】2道面试真题,带你领略算法思想【附思路、动图、源码】

Dream-Y.ocean

面试 链表 9月月更

从东南亚到中东,为什么社交类产品成为游戏出海的突破口?

融云 RongCloud

白皮书 社交网络 出海 社交娱乐

大数据ELK(六):安装Elasticsearch

Lansonli

ES 9月月更

深度剖析“八大排序”(上)_ 探寻一些不为人知的细节

Dream-Y.ocean

排序算法 9月月更

深度剖析“八大排序”(下)- 交换排序 | 快速排序 & 优化 | 非比较排序_探寻一些不为人知的细节

Dream-Y.ocean

排序算法 9月月更

C++来时路 _ 重温经典之C++类和对象 | 三大特性之一 - 封装 | 腾讯面试题

Dream-Y.ocean

c++ 封装 底层 腾讯面试 9月月更

怎样提高报表呈现的性能

陈橘又青

sql 9月月更

openjdk镜像的tag说明

程序员欣宸

Docker Docker 镜像 9月月更

明道云新增四项国产信创平台兼容性认证

明道云

最高增强至1440p,阿里云发布端侧实时超分工具,低成本实现高画质

阿里云大数据AI技术

机器学习 企业号九月金秋榜

【数据结构与算法】LeetCode面试真题,带你领略算法思想

Dream-Y.ocean

面试 队列 9月月更

Notebook交互式完成目标检测任务

华为云开发者联盟

人工智能

当面试官问你:如何才能带领好团队?

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 测试面试 | 某互联网大厂测试面试真题,你能回答出多少?

测吧(北京)科技有限公司

测试

【数据结构与算法】粽子树?二叉树_关于堆你不知道的事情

Dream-Y.ocean

栈和队列 9月月更

【web开发基础】php开发基础快速入门(1)-PHP介绍及开发环境快速安装和基本使用介绍

迷彩

Web应用开发 php开源 9月月更 web开发基础

跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

华为云开发者联盟

Python 人工智能 企业号九月金秋榜

议题征集:NGINX Sprint China 2022 线上大会

NGINX开源社区

nginx 开源软件 Sprint

软件测试 | 测试开发 | 测试面试 | 某个版本/模块问题很多,但上线时间紧迫怎么办?

测吧(北京)科技有限公司

测试

架构模块一作业

Diana S

架构实战营

【数据结构与算法】详解 “清华大学(考研)OJ题”_ 二叉树重要面试OJ题

Dream-Y.ocean

面试 算法 清华大学 9月月更

打印 Logger 日志时,需不需要再封装一下工具类?

程序员小航

Java 日志 slf4j

【数据结构与算法】二叉树题目很难?一句”技巧“巧做基础二叉树题目

Dream-Y.ocean

二叉树 二叉树遍历 9月月更 技巧总结

前端三件套 HTML+CSS+JS基础知识内容笔记

明金同学

前端

少儿编程是智商税?还是未来的生存技能?

博文视点Broadview

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