正如之前多次说过的那样,你可以在一个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一起工作?
答案 0 :(得分:8)
从另一个人那里产生一个演员是完全安全的。
然而,无论如何与演员之间共享可变状态都不是。它们产生的地方。
演员的全部意义在于他们应该通过邮箱与消息进行沟通。滥用此模型并且actor不会提供比并发问题更多的保护,而不是原始线程。
答案 1 :(得分:1)
在您的示例中,i
确实可以从多个线程访问;做计算和线程调用回复。也许您应该回复Future
?
reply( future { /* perform computation */ } )
然后调用者可以对期货输入渠道做出反应(非阻塞),或者只是apply()
(阻止)。
答案 2 :(得分:0)
演员只能同时处理一条消息,所以你在演员中所做的任何事情都是线程安全的,你从不考虑线程的安全性。
这是演员及其并发设计背后的完整理念。