つかびーの技術日記

情報系修士卒のWeb系技術日記です。現在のフォーカス分野はアドテクです。

Actor Extensionはスレッドアンセーフな点に注意

   

以下の記事の通りActor Extensionを調べたのですが、1点注意点を見つけたので追記です。

Akka ActorのExtensionを少し調べてみた

結論:スレッドアンセーフ

ActorSystemごとに1インスタンス、全Actorから共通して使える、状態も持てる。という訳なので、やはり複数Actorから同時にアクセスされればレースコンディションが発生します。スレッドアンセーフです。

ダメなコード例

前回の例を少し変えて以下のようなコードを実行してみます。

Actorを2つ作って、それぞれ10000回メッセージを送っています。これにより合計20000回incrementされて、最後のGetCountにより、20000がprintlnされるように見えます。が、実際はそうなりません。

こんな感じで実行するたびに値が異なり、20000になりません。競合していますね。

対策

今回の例だとAtomicLongを使うとか。そうでない場合は無難にsynchronizedでしょうか。GitHubでコード検索したらsynchronizedをちらほら見かけました。

という訳でActorを使っているとついついレースコンディション周りをおろそかにしがちですが、Extensionを使う場合は十分気をつけましょう。

 - 未分類 , , ,