1

私のアプリケーションには、ApplicationUsers変更可能なメンバーを持たないクラスがあります。インスタンスの作成時に、ユーザー データベース全体 (比較的小さい) を不変のコレクションに読み込みます。データをクエリするためのメソッドがいくつかあります。

私は現在、新しいユーザーを作成する (または属性の一部を変更する) 必要があるという問題に直面しています。私の現在の考えは、高レベルで次のような Akka アクターを使用することです。

class UserActor extends Actor{
  var users = new ApplicationUsers

  def receive = {
    case GetUsers => sender ! users

    case SomeMutableOperation => {
      PerformTheChangeOnTheDatabase() // does not alter users (which is immutable)
      users = new ApplicationUsers // reads the database from scratch into a new immutable instance
    }
  }
}

これは安全ですか?私の推論は、以前のインスタンスを使用する他のスレッドusersによって が変更されるたびに、古いバージョンへのハンドルが既にあり、影響を受けるべきではないということです。また、新しいインスタンスが安全に構築されるまで、リクエストは処理されません。SomeMutableOperationusersGetUsers

不足しているものはありますか?私の構造は安全ですか?

更新: おそらくこれを行うにはエージェントを使用する必要がありますが、疑問は残ります: 上記は安全ですか?

4

2 に答える 2

3

不変のデータ型を持ちvar、アクター内でそれらを参照します。このようにして、データを自由に共有でき、可変性はアクターに限定されます。var注意すべき唯一のことは、アクターの外部で実行されるクロージャーからを参照する場合です(例:Future変換またはPropsインスタンス)。このような場合、スタックローカル コピーを作成する必要があります。

val currentUsers = users
other ? Process(users) recoverWith { case _ => backup ? Process(currentUsers) }

最初のケースでは、値を取得するだけで問題ありませんがbackup、別のスレッドから を要求するため、 が必要になりval currentUsersます。

于 2013-05-11T13:55:43.523 に答える
1

私にはうまく見えます。ここにはエージェントは必要ないようです。

于 2013-05-11T07:37:03.213 に答える