2011-10-14 12 views

risposta

18

È probabilmente perché il modello di attore presuppone che ogni istanza di attore elabora in sequenza la propria casella di posta. Ciò significa che non dovrebbe mai accadere, che due o più thread concorrenti eseguono il codice dell'istanza di un singolo attore. Tecnicamente è possibile creare un metodo nella classe di un attore (perché è ancora un oggetto) e chiamarlo contemporaneamente da più thread, ma ciò rappresenterebbe un importante allontanamento dalle regole di utilizzo dell'attore e lo si farebbe "a proprio rischio", perché quindi si perderebbero tutte le garanzie di sicurezza del thread di quel modello.

Questo è anche uno dei motivi per cui Akka ha introdotto un concetto di ActorRef: un handle che consente di comunicare con l'attore tramite il passaggio di messaggi, ma non chiamando direttamente i relativi metodi.

+0

Grazie Przemek. Questo spiega. –

4

Penso che abbiamo abbastanza ben documentato: http://doc.akka.io/docs/akka/2.3.9/general/jmm.html

+0

Ho letto quel documento più volte. Sono un principiante JVM; nella mia comprensione, un "succede prima" conferma solo la "visibilità". Possiamo ancora avere problemi a causa di più thread nella sezione critica. –

+3

Akka salvaguarda contro l'esecuzione di messaggi per lo stesso attore allo stesso tempo, consentendo sempre la pianificazione dell'esecuzione della cassetta postale una sola volta. (o è programmato per l'esecuzione o non lo è). Rendendo la Mailbox Runnable non solo evitiamo di allocare nuovi runnable, ma possiamo anche, tramite una semplice operazione CAS, assicurare che una mailbox sia programmata per l'esecuzione una sola volta, il che significa che non è necessaria alcuna contabilità aggiuntiva per assicurarsi che 2 i thread non elaborano la stessa cassetta postale allo stesso tempo. –

+0

Fantastica spiegazione. Questo sicuramente mi aiuterà in ulteriore lettura. Una domanda però, come avrei potuto dedurre l '"elaborazione reciprocamente esclusiva" della casella di posta da http://akka.io/docs/akka/1.2/general/jmm.html? –

2

Gli attori sono 'Treadsafe'. The Actor System (AKKA) offre a ciascun attore il proprio "filo leggero". Significa che questo non è un battistrada, ma il sistema AKKA darà l'impressione che un attore sia sempre in esecuzione nello stesso thread allo sviluppatore. Ciò significa che tutte le operazioni eseguite a seguito di un'azione su un messaggio sono, a tutti gli effetti, thread-safe.

Tuttavia, non si deve minare AKKA utilizzando messaggi mutabili o stato pubblico. Se sviluppi i tuoi attori come unità indipendenti di funzionalità, allora saranno sicuri.

Consulta anche: http://doc.akka.io/docs/akka/2.3.12/general/actors.html#State

e http://doc.akka.io/docs/akka/2.3.12/general/jmm.html per uno studio più approfondito del modello di memoria AKKA e come gestisce le questioni 'battistrada'.

Problemi correlati