10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

评论

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

技术如何分担产品之忧?

石云升

极客时间 1月月更 技术领导力实战笔记

JSON.stringify() 的 5 使用场景

devpoint

JavaScript 前端开发 JSON格式化

从任务分配角度来看管理

石云升

极客时间 1月月更 技术领导力实战笔记

架构误区系列11:无聊的架构归一

agnostic

架构治理

你知道哈希算法,但你知道一致性哈希吗?

JAVA旭阳

Java 架构

【Linux技术专题系列】「必备基础知识」一起探索和实践sftp配置之密钥方式登录

码界西柚

Linux SSH SSH工具 sftp

技术管理者如何获得下属的认同?

石云升

极客时间 1月月更 技术领导力实战笔记

【PHP】英文博客专栏PHP快速入门个人笔记

懒时小窝

php

FPGA:硬件描述语言简介

timerring

FPGA

架构误区系列12:一切皆依赖云平台

agnostic

云计算 部署架构

复习前端:JavaScript V8 引擎机制

devpoint

chrome JIT V8

Python 内置界面开发框架 Tkinter入门篇 甲

eng八戒

Python GUI tkinter

【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南

码界西柚

redis 性能调优 慢查询

我们需要怎样的低代码平台

agnostic

低代码

复习前端:前端安全

devpoint

CSRF xss攻击 前端安全

Studio One2024旗舰级DAW的跨版本升级

茶色酒

Studio One 5 Studio One2023

工作这么多年,我总结的数据传输对象 (DTO) 的最佳实践

JAVA旭阳

Java 架构

如何快速优雅的用Know Streaming创建Topic

石臻臻的杂货铺

获取 topic等信息 后端、

极客时间运维进阶训练营第十二周作业

9527

开源移动核心网Magma架构设计启示

俞凡

架构 网络 通信

复习前端:前端应掌握的网络知识

devpoint

OSI七层协议 http2 HTTPS协议加密

2022年终总结-无所吊谓

wood

年终总结 稳定 开心 普通的一年

CleanMyMac X2024汉化版安装包新增

茶色酒

CleanMyMac X CleanMyMac X2023

关于环境变量配置的思考总结

timerring

Go 环境变量

水果软件2024FL Studio中文语言版本下载

茶色酒

FL Studio FL Studio 21

Portraiture2024汉化版磨皮插件下载

茶色酒

Portraiture2023 Portraiture

万字长文搞懂产品模式和项目模式

俞凡

团队管理

Kratos微服务框架API工程化指南

golang gRPC microservice Kratos 工程化

CleanMyMacX4.12.2最新版本更新下载

茶色酒

CleanMyMacX

精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)

码界西柚

Java JVM JVM原理 2023

会声会影2023和谐版本补丁包下载

茶色酒

会声会影 会声会影2023

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