2012-01-04 17 views
5

Si serializa un objeto en Java y lo envía (a través de un socket) a los nodos de un clúster, ¿obtiene automáticamente seguridad de subprocesos?Serialización en java: seguridad automática de hilos?

Supongamos que tiene un clúster y cada nodo tiene varios núcleos. El servidor tiene un objeto Java que desea enviar a cada núcleo en cada clúster para procesar. Serializa ese objeto y lo envía a cada receptor.

A través de la serialización, ¿ese objeto se copia de manera automática algo "profundamente" y automáticamente se obtiene la seguridad de la hebra en ese objeto? No obtendrá ningún problema de simultaneidad entre los distintos nodos del clúster porque no pueden acceder al mismo lugar en la memoria ... ¿pero qué ocurre con los núcleos en los nodos?

+1

No, no necesariamente. Obtienes diferentes objetos en diferentes máquinas.Cómo funciona todo junto determinará la "seguridad del hilo". Sin embargo, la reducción del estado mutable compartido entre "hilos" es una forma de * simplificar * la concurrencia. Sin embargo, los nodos múltiples * no son hilos *, sino procesos independientes. (Sin embargo, existe una memoria distribuida * compartida * que trabaja para volver a introducir el aspecto del estado mutable compartido). –

+0

Posibles duplicados; http://stackoverflow.com/questions/4003741/java-object-serialization-thread-safe – Naved

+0

Título similar - pregunta diferente – user651330

Respuesta

1

Definitivamente es "seguro para subprocesos" (en el sentido de que lo está definiendo). Serializar es, por definición, una copia profunda del objeto y cada trabajador obtendrá un objeto diferente.

4

La operación de serialización no es segura para subprocesos y no es una buena idea volver a serializar un objeto que se está modificando. Sin embargo, cualquier copia profunda del objeto, en el mismo subproceso, proceso o universo es una copia completa y no se cambia cuando se cambia el original.

Nota: si envía el objeto actualizado de nuevo, es posible que no vea las actualizaciones porque simplemente envía una referencia al objeto. Por este motivo, debe llamar al reset() en el remitente si desea enviar una actualización. Otra razón para usar reset() es evitar una "fuga de memoria" ya que el remitente y el receptor recordarán todos los objetos que hayan escrito o leído.

+1

Para aclarar, el método 'reset()' del que Peter está hablando está en [ObjectOutputStream] (http: //docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html#reset%28%29). –

3

A través de la serialización, ¿ese objeto se copia de forma automática algo "profundamente copiado" y automáticamente se obtiene la seguridad del hilo en ese objeto?

No está claro a qué se refiere, pero ...

  • El proceso de serialización no es seguro para subprocesos. Por ejemplo, si un hilo serializa un objeto mientras otro lo está cambiando, el objeto serializado (es decir, la secuencia de bytes) puede no representar una instantánea consistente del objeto.

  • Una vez serializado, la secuencia de bytes no suele ser accesible para un hilo que podría interferir con ella, por lo que la seguridad de la hebra no es un problema.

  • Cuando la secuencia de bytes se deserializa, obtiene objetos completamente nuevos. No puede haber problemas de seguridad de subprocesos con estos objetos a menos que el subproceso que los deserialice también los publique en otros subprocesos.

Usted no va a obtener ningún problema de concurrencia entre los distintos nodos en el clúster porque no pueden estar accediendo al mismo lugar en la memoria ... pero ¿qué pasa entre los núcleos en los nodos?

No hace ninguna diferencia si los objetos se deserializan en el mismo espacio de direcciones que se serializaron. La deserialización crea nuevos objetos. Son copias de los objetos originales.