代码之家  ›  专栏  ›  技术社区  ›  Collin

如何安全地在Actors中使用ThreadLocal缓存?

  •  1
  • Collin  · 技术社区  · 14 年前

    我的应用程序最终通过Actors做了很多后台处理,特别是加载Mapper实例,然后对它们做一些工作。这是非常重复的,我想在我的演员代码中缓存这些查找。

    我通常会使用一个ThreadLocal。但是,由于线程初始化是由Actor线程池处理的,因此似乎只有在Actor的PartialFunction中才能初始化并随后清除ThreadLocal,该PartialFunction接收传入消息。

    我现在要做的是在我的演员身上创造另一种方法,比如:

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

    其中 init

    有更好的办法吗?

    1 回复  |  直到 14 年前
        1
  •  5
  •   oxbow_lakes    14 年前

    不需要使用线程局部变量 :在一次反应中,你 var . 更重要的是,因为你的反应是 相继的 actor子系统为您管理同步,您 能够 (如果需要)从不同的反应访问状态:

    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
      }
    
    }