Piense en métodos como definiciones de funcionalidad. Cuando dos subprocesos ejecutan el mismo método, no están relacionados de ninguna manera. Cada uno creará su propia versión de cada variable local y no podrá interactuar entre sí de ninguna manera.
Si las variables no son locales (como las variables de instancia definidas fuera de un método en el nivel de clase), entonces se adjuntan a la instancia (no a una sola ejecución del método). En este caso, dos subprocesos que ejecutan el mismo método ven la única variable, y esto no es seguro para subprocesos.
Considere estos dos casos:
public class NotThreadsafe {
int x = 0;
public int incrementX() {
x++;
return x;
}
}
public class Threadsafe {
public int getTwoTimesTwo() {
int x = 1;
x++;
return x*x;
}
}
En el primero, dos subprocesos que se ejecutan en la misma instancia de NotThreadsafe
verán la misma x. Esto podría ser peligroso, porque los hilos están intentando cambiar x! En el segundo, dos subprocesos que se ejecutan en la misma instancia de Threadsafe
verán variables totalmente diferentes y no pueden afectarse entre sí.