【问题标题】:Is spawning a new actor from an existing one thread-safe?从现有的线程安全中产生一个新的actor吗?
【发布时间】:2011-08-28 00:03:38
【问题描述】:

正如在此之前多次说过的,您可以在 actor 内生成一个新线程(将长时间处理的计算放入 actor{} 块中),并且生成的计算将安全地在同一个线程池上运行(由演员调度程序)。

actor{
    var i = 0
    case msg => actor {
        // computation
        i = i + 1  // is `i` still thread safe?
                   // looks like it can be access simultaneosly from 2 two threads now
                   // should I make it @volatile?
    } 
    reply(i) 
}

但是,它是线程安全的吗?一般来说,它是否遵循原始设计,即在某一时刻只有一个线程可以与一个参与者一起工作?

【问题讨论】:

    标签: scala thread-safety actor


    【解决方案1】:

    从另一个演员中生成演员是完全安全的。

    但是,无论它们是如何以及在何处生成的,都不能在参与者之间共享可变状态。

    演员的全部意义在于他们应该通过他们的邮箱与消息进行交流。滥用此模型,参与者无法提供比使用原始线程更多的保护来避免并发问题。

    【讨论】:

      【解决方案2】:

      在您的示例中,i 确实可以从多个线程访问;进行计算和线程调用回复。或许你应该回复Future?

      reply( future { /* perform computation */ } )
      

      然后调用者将能够对期货输入通道做出反应(非阻塞),或者只是 apply()(阻塞)。

      【讨论】:

        【解决方案3】:

        Actor 只能同时处理一条消息,因此您在 Actor 中所做的任何事情在设计上都是线程安全的,您无需考虑线程安全。

        这是演员背后的完整想法,它是并发设计。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-18
          • 2010-11-11
          相关资源
          最近更新 更多