熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

基於角色模型的Java開發

2022-06-13   來源: 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)但這更具挑戰性因為它會將您帶回鎖和同步的世界中簡而言之將您的並發編程模型轉換為角色使多線程應用程序更容易編碼


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26649.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.