2010-11-04 58 views
1

我的應用程序最終通過Actors做了大量的後臺處理,特別是加載Mapper實例,然後對它們做一些工作。這是非常重複的,我想在我的Actor代碼中緩存一些這些查找。如何安全地在Actor中使用ThreadLocal緩存?

我通常會爲此使用ThreadLocal。但是,由於線程初始化是由Actor線程池處理的,所以似乎只有初始化並隨後清除ThreadLocal的地方纔會在actor的PartialFunction中接收傳入消息。

我現在正在做的是在我的演員創造另一種方法,就像這樣:

override def aroundUpdates[T](fn: => T) : T = { 
    clientCache.init { 
    fn 
    } 
} 

init方法處理在finally塊清理ThreadLocal的。我不喜歡這種方法,因爲aroundUpdates只是爲了設置緩存而存在,它聞起來像是一種代碼味道。

有沒有更好的方法來做到這一點?

回答

5

你並不需要使用線程當地人:一個反應,你在單個線程運行時。因此,你可以使用正常的var。更重要的是,因爲你的反應是連續和演員子系統爲您管理同步,你可能(如果你想)從不同的反應訪問狀態:

def act = loop { 
    var state : String = null 

    def foo = state = "Hello" 
    def bar = { println(state + " World"); state = null } 
    def baz = println(state + " Oxbow") 
    react { 
    case MsgA => foo; bar 
    case MsgB => baz 
    } 

} 

因此線程局部變量毫無任何意義,以在你自己的反應中使用!

+0

感謝您的回覆。我得出的結論是我的設計太複雜了(一組調用方法超出了他們的定義範圍)並需要清理。 – Collin 2010-11-04 18:45:30