歡迎您光臨本站 註冊首頁

基於角色模型的Java開發

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  對於軟體開發人員而言,調試多線程應用程序中的非確定缺陷是最痛苦的工作.因此,像大多數人一樣,我鍾愛使用 Erlang 和 Scala 等函數語言進行併發編程.

  Scala 和 Erlang 都採用了角色模型來進行併發編程,沒有採用線程概念.圍繞角色模型的創新並不僅限於語言本身,角色模型也可供 Kilim 等基於 Java 的角色框架使用.

  Kilim 對角色模型的使用非常直觀,稍後您將看到,該庫使構建併發應用程序變得異常簡單.

  多核挑戰

  在 2005 年,Herb Sutter 編寫了一篇現在仍然頗為著名的文章 「The Free Lunch is Over: A Fundamental Turn Toward Concurrency in Software」.在這篇文章中,他摒棄了一直誤導著人們的觀念,那就是摩爾定律將繼續促進越來越高的 CPU 時鐘速率.

  Sutter 預言了 「免費午餐」 的終結,通過越來越快的晶元來捎帶提升軟體應用程序的性能將不再可能.相反,他認為應用程序性能的顯著提升將需要利用多核晶元架構來實現.

  事實證明他是對的.晶元製造商已經達到了一種硬性限制,晶元速率已穩定在 3.5 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 類型接受 java.lang.Object.Task 可以發送 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開發已經有261次圍觀

http://coctec.com/docs/java/show-post-60308.html