2012-07-18 12 views
18

Tengo una pregunta sobre el alcance de la variable.Variables locales en método estático y seguridad de hilos

Por ejemplo:

class A { 
    private static void test() { 
     // do something with local variables 
    } 
} 

ahora hago dos hilos, y crear una instancia de A para cada hilo.

  1. Cuando llamo test() en cada hilo, puedo garantizar que es seguro para subprocesos test()?

  2. ¿Dónde están las varibles locales en test() almacenan? ¿Cada pila de hilos? ¿Espacio de almacenamiento dinámico?

P.S. Sé que la estática es totalmente inútil en este caso. Lo encontré en nuestro código heredado; ¡Solo quiero asegurarme de lo que sé!

Respuesta

28

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

referencias locales a objetos son un poco diferentes. La referencia en sí no es compartida. El objeto al que se hace referencia, sin embargo, no se almacena en la pila local de cada subproceso. Todos los objetos se almacenan en el montón compartido. Si un objeto creado localmente nunca escapa al método en el que se creó, es seguro para subprocesos. De hecho, también puede pasarlo a otros métodos y objetos, siempre que ninguno de estos métodos u objetos haga que el objeto pasado esté disponible para otros hilos.

miembros de objetos se almacenan en el montón junto con el objeto. Por lo tanto, si dos subprocesos llaman a un método en la misma instancia de objeto y este método actualiza los miembros de objeto, el método no es seguro para subprocesos.

Comprobación de seguridad de subprocesos: si un recurso se crea, usa y elimina dentro del control del mismo subproceso, y nunca escapa al control de este subproceso, el uso de ese recurso es seguro para subprocesos.

Desde: http://tutorials.jenkov.com/java-concurrency/thread-safety.html

+2

1, a pesar de que sin duda puede 'pasar', (señal), los objetos a otros hilos, pero el subproceso que creó por lo general debe 'renunciar a la propiedad' de la misma, por ejemplo. anulando su propia referencia o sobrescribiéndola creando otro objeto, de modo que dos hilos nunca puedan operar en el mismo objeto. Si esto no se hace, el objeto se comparte, como usted describe, y necesitaría bloqueos para acceder. –

+0

Sí, por esa razón, eliminar el objeto anulando la referencia es una buena idea. – Erol

+0

¡Estuve a punto de hacer esta pregunta! – JohnMerlino

0

Para el número 1, no sé lo que hace test(), así que no puedo responder. Si modifican alguna variable static de la clase A, es posible que no sea segura para subprocesos. Si ambos subprocesos a lo largo del camino se referencian al mismo objeto, dependiendo de cómo se defina el objeto, es posible que no sea seguro para subprocesos.

Para el número 2, las variables locales están en la pila de cada hilo (o al menos conceptualmente por el estilo), por lo que no hay que preocuparse acerca de las variables locales siendo modificados por los otros hilos.

2

Cuando llamo test() en cada hilo, puedo garantizar que la prueba() es seguro para subprocesos?

Sí, sería seguro si el método test() está trabajando en el método variables locales del método.

¿Dónde se almacenan las varibles locales en test()? cada pila de hilos? ¿espacio de almacenamiento dinámico?

Método La variable local se almacena en la propia pila de cada subproceso.

Cuestiones relacionadas