Scala 从现有的单线程生成新的参与者是否安全?

Scala 从现有的单线程生成新的参与者是否安全?,scala,thread-safety,actor,Scala,Thread Safety,Actor,正如前面多次提到的,您可以在actor中spwan一个新线程(将一个长的处理计算放入actor{}块),生成的计算将安全地运行在同一个线程池上(actor调度器使用) 但是,它是线程安全的吗?它是否遵循了最初的设计,即一段时间内只有一个线程可以与一个参与者一起工作?从另一个参与者派生一个参与者是完全安全的 然而,在参与者之间共享可变状态并非如此,不管它们是如何产生的&在哪里产生的 参与者的全部要点是,他们应该通过邮箱与消息进行通信。滥用此模型,参与者在并发问题上提供的保护并不比原始线程多。在您的

正如前面多次提到的,您可以在actor中spwan一个新线程(将一个长的处理计算放入
actor{}
块),生成的计算将安全地运行在同一个线程池上(actor调度器使用)


但是,它是线程安全的吗?它是否遵循了最初的设计,即一段时间内只有一个线程可以与一个参与者一起工作?

从另一个参与者派生一个参与者是完全安全的

然而,在参与者之间共享可变状态并非如此,不管它们是如何产生的&在哪里产生的


参与者的全部要点是,他们应该通过邮箱与消息进行通信。滥用此模型,参与者在并发问题上提供的保护并不比原始线程多。

在您的示例中,
i
确实可以从多个线程访问;执行计算和线程调用应答。也许你应该回复一个
未来

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

然后,调用方将能够对未来输入通道(非阻塞)做出反应,或者简单地
apply()
(阻塞)。

参与者只能同时处理一条消息,因此您在参与者内所做的任何事都是线程安全的,因为您从未考虑过线程安全

这是actors及其并发设计背后的完整思想

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