写点什么

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

评论

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

Kafka两个高性价比的参数调优

我是个bug

Java 大数据 kafka

架构师那些不能碰的禁忌

曲水流觞TechRill

架构师

Redis系列(七):缓存只是读写回种这么简单吗?如果是,那么请你一定看看这篇文章!

z小赵

redis 分布式 高并发系统设计

7个获取访问者真实IP的方法,速学!!!

华为云开发者联盟

nginx 大前端 网站 IP 服务器

LeetCode 1052. Grumpy Bookstore Owner

liu_liu

算法 LeetCode

Linux服务器存在某进程CPU过高如何追溯其问题根源?

Nick

Java Linux centos

一文带你了解Zookeeper所有核心概念

小隐乐乐

zookeeper 分布式 分布式架构

HTTPS详解

Bruce Duan

https 对称加密 非对称加密

正则表达式基础详解

懒猫

Java 正则表达式 大前端 正则

华为云FusionInsight MRS融合大数据平台进阶之路

数据湖洞见

大数据 新特性 FusionInsight 华为云 智能数据湖

职场求生攻略答疑篇之 1 —— 加班沉思录

臧萌

程序员 加班

实战案例丨ModelArts在数据标注、数据过滤上的应用技巧:自动分组

华为云开发者联盟

人工智能 数据 图像识别 图片 分类

主宰操作系统的经典算法

苹果看辽宁体育

后端 操作系统

节约60%成本!虎牙直播云端大数据是怎么做到的?

腾讯云大数据

Spring Boot + Vue前后端分离项目,Maven自动打包整合

xcbeyond

maven 前后端分离 springboot 部署

国产开源流媒体SRS4.0对视频监控GB28181的支持

潇湘落木

音视频 云直播 短视频 流媒体

推荐一款技术人必备的接口测试神器:Apifox

狂师

测试 测试驱动开发实战营 接口测试 测试框架

如何消灭飞机的“黑色十分钟”,AI来帮忙

华为云开发者联盟

华为 AI 智能时代 模型 华为云

API接口限流

Bruce Duan

分布式限流 单体限流 限流算法

[POJ 1002] 487-3279 C++解题报告

一直AC一直爽

POJ ACM

一文了解JDK12 13 14 GC调优秘籍-附PDF下载

程序那些事

GC JDK14 秘籍 JDK12 JDK13

上海首批金融科技“监管沙盒”应用名单出炉 区块链技术备受青睐

CECBC

金融科技 金融监管 创新与安全 智能多元化

week8 作业

Shawn

IO系列——UNIX五种IO模型

Java联盟

io 多路复用 异步IO

干货分享丨玩转物联网IoTDA服务系列四-智能网关

华为云开发者联盟

物联网 智能设备 应用场景 华为云 mqtt

Nginx 限流配置

Bruce Duan

nginx

ARTS 第 5 周

乌拉里

一个好用的工作生活平衡方式

霍太稳@极客邦科技

Go: 通过代码学习 Map 的设计 — Part II

陈思敏捷

map Go 语言

Java架构-Java代码规范那些事

我是苞谷

Java

架构师训练营第八周作业

张明森

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