軟件事務內存導論(三)用Akka/Multiverse STM實現並發
用Akka/Multiverse STM實現並發
上麵我們已經學習了如何在Clojure裏使用STM,我猜你現在一定很好奇如何在Java代碼中使用STM。而對於這一需求,我們有如下選擇:
- 直接在Java中使用Clojure STM。方法非常簡單,我們隻需將事務的代碼封裝在一個Callable接口的實現中就行了,詳情請參見第7章。
- 喜歡用注解(annotation)的開發者可能會更傾向於使用Multiverse的STM API.
- 除了STM之外,如果我們計劃使用角色(actor),那麼還可以考慮選擇Akka庫。
Multiverse是由Peter Veentjer主持開發的一個基於Java的STM實現。通過這個庫,我們可以在Java代碼中使用注解來標識事務邊界。我們既可以用 @TransactionalMethod注解將單個的方法標記為事務性的,也可以用@TransactionalObject注解將一個類的所有方法都 標記為事務性的。為了與其他JVM上的語言進行集成,Multiverse還提供了一組豐富的API來控製事物的開始和結束。
Akka是一個由Jonas Boner主持開發的一個基於Scala的解決方案,該方案可以用於包括Java在內的很多其他運行於JVM上的語言。Akka不但提供了STM和基於角 色(actor)的並發方案,還提供了將二者混合使用的選項。此外,Akka使用Multiverse作為其STM的實現並提供了ACI(ACID的子 集)特性。
Akka的性能非常棒,並且由於它既支持STM又支持基於角色(actor)的模型(詳情請參見第8章),本章我們將會用它來實現演示Java STM的例子。
Akka/Multiverse中的事務
Akka的Java版采用了Multiverse的Clojure風格的STM。與Java那繁冗的代碼風格相比,Clojure風格的Akka不 會強迫我們在能夠修改可變實體之前就創建事務。如果我們沒有主動提供事務,則Akka/Multiverse就會自動把訪問請求封裝在一個事務中。所以當 我們處於事務之中時,Akka的ref與Clojure的ref的表現是相同的;而當我們位於事務之外時,Akka ref的表現則更像是Clojure的atom。換句話說,想要使變更同步且有序就必須使其在事務中完成,否則變更將是同步但無序的。在任何情況 下,Akka都會保證對於ref的更改是原子的、隔離的且一致的,並同時提供了不同等級的協調粒度。
在Akka中,我們既可以用寫代碼的方式在事務層對事務進行配置,也可以通過配置文件在應用程序/JVM層進行配置。例如,我們可以將一個事務定義 為隻讀(readonly),於是Akka將不再允許任何位於該事務範圍內的Akka引用被修改。這樣做的好處是,如果我們將一些不可變的事務設置為隻 讀,則程序性能將會得到一定的提升。除此之外,我們還可以控製在衝突情況下事務的最大重試次數。當然,還有很多其他參數可供我們配置,詳情請參閱Akka 的幫助文檔。
Akka擴展了Multiverse中的嵌套事務(請參見6.9節),所以我們能夠很方便地在事務中調用啟動其他事務的函數。默認情況下,這些內部事務或嵌套事務都是與其外部事務融為一體的。
使用Akka引用和事務
Clojure中的ref是在語言層定義的,而 Akka是一個公共類庫所以不能依賴任何現有語言的支持。所以Akka在其akka.stm包中提供了一個托管事務引用(managed transactional reference)Ref和一些為原始類型而設的特殊類,如IntRef、LongRef等。Ref(以及所有原始類型的特化引用)代表指向類型T的一 個不可變值的托管可變實體(managed mutable identity)。像Integer、Long、Double、String這些類型以及其他不可變類型都符合作為值對象的(value object)條件。如果我們用了自己定義的類,則必須保證這個類是不可變的。也就是說,這個自定義的類隻能包含final字段。
我們可以創建一個Ref的實例作為托管事務引用,其值可以在初始化時指定或幹脆不指定(默認為null)。如果想獲得引用的當前值,可以使用 get()函數。如果要使引用指向另一個可變實體,則可以使用swap()函數。這些調用可以在我們提供的事務裏執行,但如果我們沒提供事務的話,它們也 可以在其各自的事務中運行。
當多個線程都試圖更改同一個托管引用時,Akka可以保證隻有一個變更可以寫入內存而其他變更將全部重做。Akka有專門的事務工具負責管理事務跨
越內存柵欄的過程。也就是說,Akka(通過Multiverse)保證了在事務中一個托管ref變更的提交會先於後續所有其他事務對該ref的讀操作,
即該變更對所有其他事務可見。
文章轉自 並發編程網-ifeve.com
最後更新:2017-05-22 16:37:32
上一篇:
Velocity官方指南-簡介
下一篇:
軟件事務內存導論(四)創建事務
undefined reference to libiconv_open ext/iconv/.libs/iconv.o by install phpsource
Erlang入門(四)——錯誤處理和魯棒性
Java IO 之 FileInputStream & FileOutputStream源碼分析
【雲和恩墨大講堂電子期刊】挑戰者:Google成功的背後
談談分布式事務之三: System.Transactions事務詳解[上篇]
麵向GC的Java編程
新華網:南通市創新大數據管理應用取得顯著成效
vmware安裝係統注意點
FPGA/CPLD簡介
JavaScript文本框的操作