2011-10-14 4 views

答えて

18

おそらく、アクターモデルでは、各アクターインスタンスが独自のメールボックスを順番に処理すると想定されるためです。つまり、2つ以上の同時スレッドが1つのアクターインスタンスのコードを実行することは決してありません。技術的には、アクターのクラス(まだオブジェクトなので)にメソッドを作成し、それを複数のスレッドから同時に呼び出すこともできますが、これはアクターの使用規則から大きく逸脱します。そのモデルのスレッド安全性の保証をすべて失うからです。

これはまた、アクカがActorRefというコンセプトを導入した理由の1つです。メッセージハンドルを使ってアクターと通信できるが、そのメソッドを直接呼び出すことはできません。

+0

ありがとうございました。それは説明します。 –

4

私たちはそれはかなりよく文書があると思う:http://doc.akka.io/docs/akka/2.3.9/general/jmm.html

+0

私はその文書を何度も読んだ。私はJVM初心者です。私の理解では、「起こる前に」は、「可視性」を実証するだけです。クリティカルセクションでは複数のスレッドが原因で問題が発生する可能性があります。 –

+3

Akkaは、同じアクタのメッセージを同時に実行することを防ぐため、メールボックスの実行スケジュールを1回だけ許可することで同時にアクタを保護します。 (それは実行予定か、そうでないか)。 Mailbox Runnableを作ることで、新しいランナブルを割り当てるのを避けるだけでなく、簡単なCAS操作でメールボックスの実行スケジュールを1回だけにすることができます。スレッドは同じメールボックスを同時に処理しません。 –

+0

すごい説明。これは確かに私がさらに読むことに役立ちます。しかし、1つの質問ですが、どのようにしてhttp://akka.io/docs/akka/1.2/general/jmm.htmlからメールボックスの「相互に排他的な処理」を推測できましたか? –

2

アクターは 'Treadsafe' です。アクターシステム(AKKA)は、各アクターに独自の「軽量スレッド」を提供します。これはトレッドではないことを意味しますが、AKKAシステムは、アクタが常に開発者自身のスレッドで実行されているという印象を与えます。つまり、メッセージを処理した結果として実行される操作は、すべての目的でスレッドセーフです。

しかし、変更可能なメッセージや公開状態を使用してAKKAを傷つけてはいけません。スタンドアロンの機能ユニットを開発すると、スレッドセーフになります。

も参照してください: http://doc.akka.io/docs/akka/2.3.12/general/actors.html#State

、より徹底的アッカのメモリモデルの研究とどのようにそれが「トレッド」の問題を管理用 http://doc.akka.io/docs/akka/2.3.12/general/jmm.html

関連する問題