2017-02-18 7 views
0

Scalaでは比較的新しいので、スレッドセーフなコレクションを作る最良の方法を決めるのに苦労しています。ScalaでAkkaアクターのスレッドセーフなコレクション

私には、注文の登録/登録解除を担当する俳優がいます。私は

class OrderOperationActor(orders: ListBuffer[Order]) extends Actor{ 
override def receive = { 
case incomingOrder: IncomingOrder => { 
    if(incomingOrder.orderOperation == OrderOperation.Register){ 
     println("Registering a new order in the list ") 
     orders += incomingOrder.order 
     sender ! orders 
    } 
    else{ 
    println("Un-registering a new order in the list ") 
    orders -= incomingOrder.order 
    sender ! orders 
    } 
} 
} 
} 

ことによってそれを達成することができましたが、それは時間の複雑性が高くなる項目を削除するための最良の選択として、ある場合には不思議?地図を代わりに使用できましたか?

+1

アクターでスレッドセーフなコレクションを使用する必要はありません。 – Ryan

答えて

0

不変のコレクション。つまり、ListBufferは絶対に行かない!実際には、不変性を一般的に狙ってください(絶対に、俳優たちの間でメッセージをやりとりするか、あなたの実装が壊れるでしょう)。明示的にそれらをscala.collection.immutableパッケージからインポートする必要があります。一方、俳優の中でvarと宣言するのではなく、注文のコレクションを渡す理由はわかりません。

+0

オペレーションスレッドを安全にすると言っているので、不変性を目指すべきですが、単純に追加または削除できるたびに新しいリストを作成するのは良い考えですか? –

+1

なぜそれは悪い考えですか?変更可能なオブジェクトの方がややパフォーマンスが良い場合もありますが、不変なコレクションを使用しない理由はありません。 –

関連する問題