1. 程式人生 > >討喜的隔離可變性(九)混合使用角色和STM

討喜的隔離可變性(九)混合使用角色和STM

宣告:本文是《Java虛擬機器併發程式設計》的第五章,感謝華章出版社授權併發程式設計網站釋出此文,禁止以任何形式轉載此文。

角色可以幫助我們對可變狀態進行很好地隔離。尤其是當問題能夠被拆分成可以獨立執行的多個併發任務、並且併發任務彼此之間都是通過訊息進行非同步通訊時,角色的表現更佳。但是,角色並未提供對跨任務的一致性進行管理的方法。所以如果我們希望兩個或多個角色的動作要麼全部成功、要麼全部失敗,則角色就無法獨立實現,而此時我們就需要通過引入STM來與角色配合完成此類功能。在本節中,我假定你已經閱讀過第6章、以及本章中有關角色和型別化角色的相關內容。

我們在4.6節和6.9節中曾經實現過一個用於在兩個Account之間轉賬的AccountService類,該類可以作為我們理解角色和STM之間這種相互作用的絕佳示例。在這個示例中,存款和取款這兩個動作對於單個賬戶來說都是隔離的,所以Account可以用一個簡單的角色或一個型別化角色來實現。然而轉賬動作需要一對兒跨越兩個賬戶的存取款動作配合起來才能完成。換句話說,在一個完整的轉賬過程中,由某個角色所負責的存款動作若想成功,只有當且僅當另一個角色所負責的取款動作也成功時才能達成。下面就讓我們用角色和STM混搭的方式來實現這個轉賬示例。

Akka提供了一些混合使用角色和STM的選項。例如,我們可以建立一個獨立的事務協調物件,並手動將多個角色按順序擺放在事務中(關於這一層次的控制細節,請參閱Akka的幫助文件)。除此之外,我們還有兩種用於管理角色間事務的方法可供選擇。我們將會在下面兩節分別來研究這兩種方法:即如何使用transactors以及如何協調型別化角色。


方 騰飛

花名清英,併發網(ifeve.com)創始人,暢銷書《Java併發程式設計的藝術》作者,螞蟻金服技術專家。目前工作於支付寶微貸事業部,關注網際網路金融,併發程式設計和敏捷實踐。微信公眾號aliqinying。