从现有的actor中生成新的actor是否线程安全?

5

正如之前在这里多次提到的那样,您可以在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个回答

8

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

然而,无论它们在哪里生成,共享可变状态都是不安全的。

actor的全部意义在于它们应该通过邮箱之间的消息通信。如果滥用这个模型,actor提供的并发问题保护将不会比裸线程更多。


1
在你的例子中,i确实可以从多个线程访问;即执行计算和调用回复的线程。也许你应该使用Future来回复?
reply( future { /* perform computation */ } )

调用者将能够对未来的输入通道(非阻塞)做出反应,或者仅使用apply()(阻塞)。

0

Actor 只能同时处理一个消息,因此您在 Actor 中执行的任何操作都是线程安全的,这是设计上的特点,您永远不必考虑线程安全性。

这就是 Actor 的完整概念和并发设计。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接