是从现有的一个线程安全产生一个新的演员吗?

时间:2011-05-18 11:49:41

标签: scala thread-safety actor

正如之前多次说过的那样,你可以在一个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) 
}

但是,它是否是线程安全的,并且它通常遵循原始设计,它表明在一个时刻只有一个线程可以与一个actor一起工作?

3 个答案:

答案 0 :(得分:8)

从另一个人那里产生一个演员是完全安全的。

然而,无论如何与演员之间共享可变状态都不是。它们产生的地方。

演员的全部意义在于他们应该通过邮箱与消息进行沟通。滥用此模型并且actor不会提供比并发问题更多的保护,而不是原始线程。

答案 1 :(得分:1)

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

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

然后调用者可以对期货输入渠道做出反应(非阻塞),或者只是apply()(阻止)。

答案 2 :(得分:0)

演员只能同时处理一条消息,所以你在演员中所做的任何事情都是线程安全的,你从不考虑线程的安全性。

这是演员及其并发设计背后的完整理念。