Kilim:actor模型和消息传递的Java实现

正像在“多核危机:Scala vs. Erlang”一文中所讲的,面对当前、尤其是未来的多CPU,需要大量的并行性计算,那么并发的消息传递和actor模型将成为一种很有希望的解决之道。这些机制在Erlang中是完全内置的,Scala的框架中则包含了Scala Actor库。在Java的世界中,同样也存在一个纯Java的实现——Kilim。

Kilim是一个Java消息传递框架,它提供了超轻量级的线程和工具,可以在这些线程之间进行快速、安全、零复制的消息传递。

Kilim包含如下组件:一个字节码后期处理程序(“weaver”),带有多个缓冲mailbox(多生产者,单消费者队列)的运行时库,一个用户级的调度器,以及一个类型系统。它的类型系统对消息内部的指针别名增加了某些约束,确保线程之间不会彼此干扰。

而且它的性能看起来很不错。据Sriram Srinivasan在Google Tech Talk的演讲所称,Kilim的任务切换比Java的线程切换快出1000倍,它的消息传递比Erlang快3倍。

Kilim的用法是在方法和参数上标注Annotation。如果一个方法被标注为 @pausable,则说明它直接地或者间接地调用了其他可暂停的方法,这种方法在其调用链中的某处,最终会调用Kilim的方法,比如Actor.sleep()或者Mailbox.get()。字节码后期处理器会将这些被注释的代码转换为延续传递风格(continuation passing style)的代码。某些语言可以直接支持“延续”。其实,之前在一些著名的Web框架,比如RIFE和Jetty之中,“延续”就已经改头换面出现在Java中了。

另外,用于参数的标注包括@free、@cuttable或@safe。Sriram Srinivasan和Alan Mycroft在ECOOP 2008的一次演讲中描述了这些参数修饰符:

这些修饰符可以理解为一个在对象树中的对象的两种正交的特性:第一,它是否被另一个对象(在后面的情况中被称为“根”)所引用;第二,它是否在结构上可以改变(它的指针型域(pointer-valued field)是否是可分配的)。第二种性质具有传递性,如果一个对象的父亲是在结构上可改变的,那么它的孩子也是。

给定这些以后,可以判定,如果一个对象是对象树的根,并且它在结构上是可改变的,则这个对象是“自由的(@free)”。一个可切割的(@cuttable)对象可能是、也可能不是根,但它是structurally modifiable。如果一个对象具有安全(@safe)特性,则不是structurally modifiable(由于传递性),而不关心它是否是根。

Actor模型出现的场合越来越多,无论未来你在哪种平台上用什么语言编程,Actor模型都会是一个十分重要的概念。

你可能感兴趣的:(Kilim:actor模型和消息传递的Java实现)