Scala 游戏控制器中的可变状态,演员的线程安全?

Scala 游戏控制器中的可变状态,演员的线程安全?,scala,playframework,actor,Scala,Playframework,Actor,如果您要以线程安全的方式在游戏控制器中维护可变状态,那么您通常会在这样做时联系参与者吗?例如 object Application extends Controller { var users = Set[String]() def addUser(username: String) = Action { request => users += username } } 因此,要使它成为线程安全的参与者代码,可能看起来像 class MyActor

如果您要以线程安全的方式在游戏控制器中维护可变状态,那么您通常会在这样做时联系参与者吗?例如

object Application extends Controller {
   var users = Set[String]()
    def addUser(username: String) = Action { request =>
        users += username 
    }
}
因此,要使它成为线程安全的参与者代码,可能看起来像

class MyActor extends Actor {
    var users = Set[String]()
    def receive = {
      case AddUser(user) =>{
        users += user
      }
}

使用Actor仅仅是为了以线程安全的方式维护共享状态,这感觉有点过头了,但如果不是Actor,您还可以选择什么其他方法来使用全局线程安全的缓存

这两个选项不是线程安全的:

var users = Set[String]()
val users = collection.mutable.Set()
如果希望基本集合是线程安全的,Scala提供了一个同步特性。 (但请不要这样做,此解决方案无法扩展,会破坏游戏性能)


我认为你最好的选择是创造一个演员。演员真的很轻,你不应该为此担心

有人发表了关于使用mutable.Set的val的评论。我错误地删除了他的评论。那个用户能再发一次吗?谢谢
import scala.collection.mutable._
new HashSet[String]() with SynchronizedSet[String]