code

2017年8月8日 星期二

Concurrent Java 4 - Actors

Even higher abstraction

isolation需要小心,因為同一個memory只要有個地方沒有用到isolation保護,整個邏輯可能就破功。

一個方法就是atomic variable,之前有提過。
另一個方法就是Actors pattern,他相當於是某個variable的代理人,透過message passing的機制來確保synchronization不會破功。

Actors

actors像是一個代理人,只對messages做出反應,他有三個部分:mailbox / methods / states,actors要保護的對象就是他的local states:




actors 可以動態建立啟動其他actors,形成一個pipeline:


上圖是一個actor pipeline來實作列印出所有prime numbers。

注意actors model裡面,所有參與者都必須是actors,才能完全在high level abstraction層面運作,否則就一定要面對lock / critical sections等。


Actors for UNBOUNDED Consumer-Buffer-Producer

一個可能的design如下:



producer actor 傳送INSERT message給buffer actor,如果有東西要放入。
buffer actor傳送 REMOVE message給 consumer actor (好奇怪),通知有東西可以拿。
consumer actor傳送 READY message給 buffer actor,通知consumed。


Actors for BOUNDED Consumer-Buffer-Producer

如果buffer是bounded,那塞入product的主動權可能落在buffer上面比較好,所以producer actor會被動的給予buffer actor product,如果收到REQUEST message:



不過可惜JAVA本身沒有實作Actors model 



沒有留言:

張貼留言