http://wangyuanzju.blog.163.com/blog/static/13029200871734854243/
06年以来我就一直关注D语言的发展,D语言立志成为C/C++之后的主流系统编程语言,拥有垃圾收集等很多很强大的特性。D语言在07年初发布了1.0版,现在正在设计其2.0版。虽然有了所谓的1.0版,目前D语言还是一门非常小众的语言,正处于快速改进演化之中,因此已经吸引了Andrei Alexandrescu等众多C++牛人的目光,这些人正将D语言作为一个实验场,将很多由于C++的历史包袱而无法在C++中实现的特性和功能加入到D语言中。
今年以来,D语言之父Walter Bright其Andrei Alexandrescu等D语言的设计者们的大部分精力都在研究怎么在D语言中更好的支持并发编程这一非常具有挑战性的课题。选择这一方向的原因是非常明显的,免费的午餐已经结束,世界已经进入多核时代,在可见的未来CPU的核数只会有增无减,并发编程将越来越普遍。所有的编程语言都想在这一场并发编程大战中拔得头筹,Java在5.0中引入了concurrent包,并千方百计的优化锁定和并发垃圾收集的性能;C++0x定义了内存模型并将加入线程和同步机制的内建支持;以前很少有人关注的Erlang等函数式编程语言由于容易实现并发来了个咸鱼翻身;还有一堆脑子少根筋的人在那里琢磨几乎很难写正确的无锁式编程;另有一堆胆大包天的人研究什么Software Transactional Memory。好一场并发编程大战正进行的如火如荼,鹿死谁手还未可知。
据我有限的了解,D语言面向并发编程的设计主要分为以下两个方面:
1、invariant数据结构和pure函数
2、通过shared关键字明确标识可能被多线程并发操作的共享数据结构和只可能被单线程操作的私有数据结构;
invariant数据结构指的是一但初始化,其值在程序运行期间即不再会被修改的数据结构。D 中的invariant数据结构具有传递性,即invariant对象指向的对象也是invariant的。这与C++中的const和Java中的 final有本质的区别。C++中的const只是数据结构的一个只读视图,你不能通过一个const指针去修改对象的状态,但其它线程却可能通过非 const指针来修改状态。Java中的final只是一个不可变的引用,不保证其引用的对象的内部状态不发生变化。pure函数是指其输出只依赖于输入的函数,即无副作用的函数。借助于invariant数据结构,D语言可以对函数是否为pure进行静态检查,只有那些所有参数都是 invariant对象或int等基本函数,并且函数中没有访问任何可变全局变量和调用非pure函数的函数才是pure函数。invariant数据结构和pure函数的主要作用是实现无副作用的函数,从而像函数式编程一样,编译优化时自动生成并发控制的代码。函数式编程语言中,所有的数据结构都是不可变的(所有修改都是创建一个新的复本,不会修改原对象),并且函数的输出只依赖于输入,这使得(理论上)编译器可以自动生成很多并发代码而保证程序的正确性。D语言不是函数式编程语言,但通过invariant数据结构和pure函数,也能得到函数式编程语言易于并发的良好收益(当然从语法形式上与函数式编程语言还是大不相同的,而且我估计用起来不会有函数式编程语言那么方便)。
invariant与pure的引入曾在D语言社区引起广泛的争议,但shared关键字则更加大胆,这一解决方案需要开发人员精确的标识一个数据结构是否可被多线程访问,从而大大的提高并发代码的安全性,但很可能会导致很多原来的代码不能执行,也会给程序员带来一定的负担,因此引起了更大的争议是不足为奇的。
上述解决方案似乎是由C++大神Andrei Alexandrescu提出的,根据这一方案,如果程序中的某些对象会被多线程并发访问,那么在创建时必须使用shared关键字指定这一对象为可共享的。与invariant相同,shared属性也具有传递性,即shared对象引用的任何对象也是shared的,因此程序从一个shared对象出发,将不可能访问到非shared的对象。
shared关键字的一大好处是可以防止不经意的共享访问,提高并发程序正确性。D语言的设计者们认为,那些面向并发访问的数据结构所有访问入口都会用synchronized关键字同步,使用时通常不会出错,通常导致程序出错的是那些本来没想到会被多线程并发访问的对象实际上被并发访问了。通过强制使用shared关键字,这类情况将不允许出现。
使用shared标识的另一大优点是可以进行更高效的垃圾收集。根据Java的应用经验,垃圾收集确实能非常大的提高应用开发(尤其是公用程序库的开发)效率,但垃圾收集的性能却一直是个头疼的问题。大型内存堆的垃圾收集时非常耗时,且或多或少都要停止所有线程(所谓stop the world),在内存越来越大,CPU核数越来越多的环境中,这一问题只会越来越严重。其实,即使是在高度并发的应用程序中,真正需要被多线程并发访问的数据通常是很少的,大部分数据仍然只会单线程访问,通过标识shared和非shared数据,系统将可以采用更好的内存分配策略和垃圾收集机制,非 shared数据在线程私有的堆中分配,垃圾收集时不需要停止其它线程,只有少量的shared数据才需要在共享堆中分配。
使用shared标识的第三大优点是可以有助于实现高效的对象锁定机制。 D语言与Java类似,都使用所谓的object monitor机制,大致说起来就是所有的对象都可以被锁定,对象锁信息存放在对象内存头中。在Java中,由于系统不清楚一个对象是否真的会被多线程并发访问,很多时间会付出不必要的加锁/解锁开销。比如Java的集合框架中的很多类都设计为可被多线程并发操作,这些类的函数都会加上 synchronized关键字,即函数执行前会加锁,返回时解锁。应用在使用这些类时,即使对象只会在一个线程内部用用,加锁/解锁的开销也不可避免。而在D中,使用shared标识后,对象是否以shared方式创建的信息会记录中对象内存头中,这样在对象加锁时,用一个非常简单的判断就可以发现非shared对象,从而跳过加/解锁操作(锁定非shared对象是无意义的)。由于对象是否以shared方式创建信息在对象创建后不会发生改变,这一判断都不需要用于CAS操作,非常快。这样,公用库的设计都将不再需要因为性能的原因为同一个数据结构实现同步和非同步两个版本(如Java中的Vector和ArrayList,StringBuffer和StringBuilder)!
invariant和pure特性已经加入到D语言2.0分支中,已经基本稳定。shared关键字的问题已经经过了长时间的讨论,目前已经决定这一特性将会被接纳到D 2.0中,但目前还没有实施,据Walter Bright估计,这一功能将在接下来的3个月内逐步实现。由于这一功能还没有实现,很多细节目前还不清楚。
分享到:
相关推荐
并发编程中的三大特性:可见性、有序性和原子性,是多线程编程中主要的并发问题来源。这些特性是理解和规避并发编程中Bug的关键。 可见性问题是指,在多线程环境下,一个线程对共享变量的修改,其他线程可能无法...
在《Java并发编程实战》中,读者也能够了解到如何将并发与现代Java语言特性结合起来,例如使用Lambda表达式和Stream API来简化并发代码的编写。 综合来看,该书不仅适合于对Java并发编程感兴趣的初学者,同样也适合...
并发编程已经成为现代计算机科学不可或缺的一部分,尤其是在Java这样的多线程支持的语言中。摩尔定律的逐渐失效意味着处理器核心数量的增加而非单核速度的提升,这使得编写能够充分利用多核处理能力的代码变得至关...
并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在Java应用程序中有效地实现并行处理。 并发编程的核心概念包括线程、...
通过阅读《Java并发编程的艺术》这本书,开发者不仅可以掌握Java并发编程的基础知识,还能了解到一些高级特性和技巧,从而在实际开发中游刃有余。同时,附带的源码将有助于加深理解,提供实际操作的机会。
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
综上所述,《Java并发编程实战》不仅涵盖了Java并发编程的基础知识和技术细节,还包含了丰富的实践经验和前瞻性的思考,是任何一位从事Java开发工作的程序员不可或缺的学习资源。无论是初学者还是有经验的开发者都能...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...
Go语言并发编程 Go语言网络编程 Go语言Web开发基础 Go语言Web框架实战 Go语言数据库交互 Go语言性能优化 Go语言错误处理与测试 Go语言构建工具与包管理 Go语言反射与接口 Go语言与微服务架构 Go语言在云原生环境的...
目前多数高级编程语言如Java、C#、Go等都内置了强大的并发支持,提供了线程、协程等并发原语,有助于简化并发编程的复杂性。此外,一些并发编程库和框架也能够帮助开发者更好地实现和管理并发任务。 综上所述,...
并发编程是现代软件开发中的关键技能,尤其是在Java这种支持多线程的语言中。Java并发API包括了线程、锁、同步、并发容器等丰富的工具,使得开发者可以构建能够充分利用多核处理器性能的应用程序。本书详细介绍了...
通过学习《Java并发编程实践》,开发者将能够更好地理解和利用Java平台的并发特性,编写出更高效、更可靠的多线程应用程序。无论是初级开发者还是经验丰富的专业人员,都能从这本书中收获宝贵的并发编程知识。
JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。
### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...
并发编程是现代软件开发中的重要组成部分,尤其是在Java这种多线程支持的语言中,理解和掌握并发编程技术至关重要。本书旨在帮助初学者快速入门,并逐步精通Java并发编程,从而提升软件性能和系统效率。 本书首先会...
他的其他背景还包括在通用语言运行时团队的工作经历,这使得他在并发编程安全性方面有着独到的见解和长期的工作经验。 本书的目标读者群体包括Windows平台的开发人员、测试人员和技术支持人员。这些人员需要对并发...
C++11 新语言特性简明参考(附录A)将会介绍 C++11 中与多线程编程相关的语言特性,让读者更好地了解 C++11 的并发工具。此外,还有并发库简要对比(附录B)、消息传递框架与完整的ATM示例(附录C)等,这些内容丰富...