2010-11-04 52 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