2011-10-14 5 views

Respuesta

18

Probablemente sea porque el modelo de actor asume que cada instancia de actor procesa su propio buzón secuencialmente. Eso significa que nunca debería suceder, que dos o más subprocesos simultáneos ejecutan código de instancia de actor único. Técnicamente, podrías crear un método en la clase de un actor (porque todavía es un objeto) y llamarlo desde varios hilos al mismo tiempo, pero esto sería una desviación importante de las reglas de uso del actor y lo harías "bajo tu propio riesgo", porque entonces perdería todas las garantías de seguridad de subprocesos de ese modelo.

Esta es también una de las razones por las que Akka introdujo un concepto de ActorRef, un identificador que le permite comunicarse con el actor mediante el envío de mensajes, pero no llamando directamente a sus métodos.

+0

Gracias Przemek. Eso explica. –

4

Creo que tenemos bastante bien documentado: http://doc.akka.io/docs/akka/2.3.9/general/jmm.html

+0

He leído ese documento varias veces. Soy un novato de JVM; en mi entender, un 'sucede antes' solo corrobora 'visibilidad'. Todavía podemos tener problemas debido a múltiples hilos en la sección crítica. –

+3

Akka protege contra la ejecución de mensajes para el mismo actor al mismo tiempo, permitiendo que el buzón se programe para su ejecución una sola vez. (o está programado para su ejecución o no). Al hacer que Mailbox Runnable no solo evite asignar nuevas ejecutables, sino que también podemos, a través de una simple operación CAS, asegurarnos de que un buzón solo se programe para su ejecución una vez, lo que significa que no se requiere una contabilidad adicional para garantizar que 2 los hilos no procesan el mismo buzón al mismo tiempo. –

+0

Explicación impresionante. Esto seguramente me ayudará a seguir leyendo. Sin embargo, una pregunta, ¿cómo podría haber deducido el "procesamiento mutuamente exclusivo" del buzón de correo desde http://akka.io/docs/akka/1.2/general/jmm.html? –

2

Los actores son 'Treadsafe'. El Actor System (AKKA) proporciona a cada actor su propio "hilo ligero". Lo que significa que esto no es una banda de rodadura, pero el sistema AKKA dará la impresión de que un actor siempre se está ejecutando en su propio hilo para el desarrollador. Esto significa que cualquier operación realizada como resultado de actuar sobre un mensaje es, a todos los efectos, segura para subprocesos.

Sin embargo, no debe socavar AKKA utilizando mensajes mutables o de estado público. Si desarrollas tus actores para que sean unidades de funcionalidad independientes, entonces serán enhebrables.

Consulte también: http://doc.akka.io/docs/akka/2.3.12/general/actors.html#State

y http://doc.akka.io/docs/akka/2.3.12/general/jmm.html para un estudio más en profundidad del modelo de memoria AKKA y cómo se las arregla problemas 'pisada'.

Cuestiones relacionadas