¿Son seguros los parámetros de los métodos en Java?

Class Shared{ public void sharedMethod(Object o){ //does something to Object } } //this is how threads call the shared method run(){ sharedInstance.sharedMethod(someObject); } 

Ahora la o se pasa como el parámetro al método. Y el mismo método es llamado por múltiples hilos en paralelo. ¿Podemos decir con seguridad que este código es seguro para subprocesos?

Hay dos escenarios:

  • Si el someObject se comparte entre los hilos
  • Si cada hilo tiene su propia copia de someObject

No, no puedes decir eso. Los parámetros del método son locales a los subprocesos, lo que significa que cada uno tiene su propia copia de la variable de referencia o . Pero si llama a este método con el mismo objeto desde varios subprocesos, entonces el argumento se compartirá entre ellos (recuerde que Java es pasable -valor). En ese caso, debe proporcionar una sincronización explícita para evitar problemas.

Sí, pero solo en dos escenarios :

  • si cada objeto que pasas en el parámetro o es inmutable ,
  • si su código garantiza que hay como máximo un hilo trabajando en el objeto referenciado por o .

De lo contrario, no , ya que el estado interno del objeto se puede cambiar por varios hilos simultáneamente.

Si llama al mismo método en varios subprocesos y le pasa el mismo objeto, ese objeto no es absolutamente seguro.

Cuando cree un hilo, tendrá su propia stack creada (método y variables locales).

Dos subprocesos tendrán dos stacks y un subproceso nunca comparte su stack con ningún otro subproceso.

No tendrá efecto hasta que esté llamando a este mismo objeto.

Trátalo de esta manera.

Si sus hilos no comparten ningún recurso común, es imposible tener problemas de concurrencia. Por lo que podemos decir a partir de la información que proporcionó, lo único que se puede compartir aquí es someObject . Si es seguro para subprocesos en sí mismo, o se copia para cada subproceso, entonces su código es seguro para subprocesos en general, a menos que haya otros recursos compartidos.

Las variables locales se almacenan en la propia stack de cada hilo. Eso significa que las variables locales nunca se comparten entre subprocesos. Eso también significa que todas las variables primitivas locales son seguras para subprocesos.

EDITAR

La instancia de LocalObject en este ejemplo no se devuelve desde el método, ni se pasa a ningún otro objeto que sea accesible desde fuera del método sharedMethod() .

Cada hilo que ejecuta el método sharedMethod() hará uso de su propio Objeto o como parámetro.

Entonces, todo el método sharedMethod() parece ser seguro para subprocesos.

La única excepción es, por supuesto, si uno de los métodos llamados con el Objeto o como parámetro, almacena la instancia del Objeto de una manera que permita el acceso desde otros subprocesos.