java

位置:IT落伍者 >> java >> 浏览文章

基于角色模型的Java开发


发布日期:2023年01月31日
 
基于角色模型的Java开发

对于软件开发人员而言调试多线程应用程序中的非确定缺陷是最痛苦的工作因此像大多数人一样我钟爱使用 Erlang 和 Scala 等函数语言进行并发编程

Scala 和 Erlang 都采用了角色模型来进行并发编程没有采用线程概念围绕角色模型的创新并不仅限于语言本身角色模型也可供 Kilim 等基于 Java 的角色框架使用

Kilim 对角色模型的使用非常直观稍后您将看到该库使构建并发应用程序变得异常简单

多核挑战

Herb Sutter 编写了一篇现在仍然颇为着名的文章 The Free Lunch is Over: A Fundamental Turn Toward Concurrency in Software在这篇文章中他摒弃了一直误导着人们的观念那就是摩尔定律将继续促进越来越高的 CPU 时钟速率

Sutter 预言了 免费午餐 的终结通过越来越快的芯片来捎带提升软件应用程序的性能将不再可能相反他认为应用程序性能的显着提升将需要利用多核芯片架构来实现

事实证明他是对的芯片制造商已经达到了一种硬性限制芯片速率已稳定在 GHz 左右多年了随着制造商越来越快地增加芯片上的核心数量摩尔定律在多核领域继续得以满足

Sutter 还提到并发编程将使开发人员能够利用多核架构但是他补充道相比如今的各种语言提供的编程模型我们亟需一种更高级的并发编程模型

Java 等语言的基本编程模型是基于线程的尽管多线程应用程序并不是很难编写但正确 编写它们仍然面临许多挑战并发编程的一个困难之处是利用线程来考虑并发性如今已有许多并发模型一种特别有趣并获得了 Java 社区认可的模型就是角色模型

角色模型

角色模型是一种不同的并发进程建模方式与通过共享内存与锁交互的线程不同角色模型利用了 角色 概念使用邮箱来传递异步消息在这里邮箱 类似于实际生活中的邮箱消息可以存储并供其他角色检索以便处理邮箱有效地将各个进程彼此分开而不用共享内存中的变量

角色充当着独立且完全不同的实体不会共享内存来进行通信实际上角色仅能通过邮箱通信角色模型中没有锁和同步块所以不会出现由它们引发的问题比如死锁严重的丢失更新问题而且角色能够并发工作而不是采用某种顺序方式因此角色更加安全(不需要锁和同步)角色模型本身能够处理协调问题在本质上角色模型使并发编程更加简单了

角色模型并不是一个新概念它已经存在很长时间了一些语言(比如 Erlang 和 Scala)的并发模型就是基于角色的而不是基于线程实际上Erlang 在企业环境中的成功(Erlang 由 Ericsson 创建在电信领域有着悠久的历史)无疑使角色模型变得更加流行曝光率更高而且这也使它成为了其他语言的一种可行的选择Erlang 是角色模型更安全的并发编程方法的一个杰出示例

不幸的是角色模型并没有植入到 Java 平台中但我们可以通过各种方式使用它JVM 对替代语言的开放性意味着您可以通过 Java 平台语言(比如 Scala 或 Groovy)来利用角色(参见 参考资料了解 Groovy 的角色库 GPars)另外您可以试用一种支持角色模型且基于 Java 的库比如 Kilim

Kilim 中的角色

Kilim 是一个使用 Java 编写的库融入了角色模型的概念在 Kilim 中角色 是使用 Kilim 的 Task 类型来表示的Task 是轻量型的线程它们通过 Kilim 的 Mailbox 类型与其他 Task 通信

Mailbox 可以接受任何类型的 消息例如Mailbox 类型接受 javalangObjectTask 可以发送 String 消息或者甚至自定义的消息类型这完全取决于您自己

在 Kilim 中所有实体都通过方法签名捆绑在一起如果您需要同时执行几项操作可以在一个方法中指定该行为扩大该方法的签名以抛出 Pausable因此在 Kilim 中创建并发类就像在 Java 中实现 Runnable 或扩展 Thread 一样简单只是使用 Runnable 或 Thread 的附加实体(比如关键字 synchronized)更少了

最后Kilim 的魔力是由一个称为 weaver 的后期进程来实现的该进程转换类的字节码包含 Pausable throws 字句的方法在运行时由一个调度程序处理该调度程序包含在 Kilim 库中该调度程序处理有限数量的内核线程可以利用此工具来处理更多的轻量型线程这可以最大限度地提高上下文切换和启动的速度每个线程的堆栈都是自动管理的

在本质上Kilim 使创建并发进程变得轻松而简单只需从 Kilim 的 Task 类型进行扩展并实现 execute 方法编译新创建的支持并发性的类之后对其运行 Kilim 的 weaver您会实现显着的性能提升!

Kilim 最初是一种外来语言但它带来了巨大的回报角色模型(以及后来的 Kilim)使编写依赖于类似对象的异步操作对象变得更加简单和安全您可以 使用 Java 的基本线程模型进行同样的操作(比如扩展 Thread)但这更具挑战性因为它会将您带回锁和同步的世界中简而言之将您的并发编程模型转换为角色使多线程应用程序更容易编码

上一篇:开发技巧:Java打印程序设计全攻略

下一篇:用javaZoom的uploadBean扩展request的功能