Hay una pregunta simple y estúpida que me molesta y hace varios argumentos en mi mente. Quiero descartar todas las dudas sobre las siguientes preguntas.
class Clstest{
public static String testStaticMethod(String inFileStr) {
// section 0
// section 1
// do something with inFileStr
// section 2
// section 3
return inFileStr;
}
}
Supongamos que hay cinco subprocesos que están ejecutando una llamada al Clstest.testStaticMethod("arg-n")
mismo tiempo.
Llamadas del hilo 1 Clstest.testStaticMethod("arg-1")
.
Cuando el hilo 1 está en la sección 1, el hilo 2 llama Clstest.testStaticMethod("arg-2")
.
Entonces, ¿qué pasará con el hilo 1? ¿Pasará al estado de reposo?
Cuando el Thread 1 tenga la oportunidad, ¿reanudará la ejecución desde la sección 1 donde se detuvo?
¿Cómo sucede cuando se comparte uno Clstest.testStaticMethod
y el mismo Clstest.testStaticMethod
entre los cinco hilos?
¿Existe la posibilidad de intercambiar el inFileStr
enviado por múltiples hilos?
fuente
Respuestas:
La respuesta de Hans Passant es buena. Pero pensé en intentar explicarlo en un nivel un poco más simple para cualquiera que se encuentre con esto y sea nuevo en Java. Aquí va..
La memoria en Java se divide en dos tipos: el montón y las pilas. El montón es donde viven todos los objetos y las pilas son donde los hilos hacen su trabajo. Cada hilo tiene su propia pila y no puede acceder a las pilas de los demás. Cada hilo también tiene un puntero en el código que apunta al bit de código que están ejecutando actualmente.
Cuando un hilo comienza a ejecutar un nuevo método, guarda los argumentos y las variables locales de ese método en su propia pila. Algunos de estos valores pueden ser punteros a objetos en el montón. Si dos subprocesos están ejecutando el mismo método al mismo tiempo, ambos tendrán sus punteros de código apuntando a ese método y tendrán sus propias copias de argumentos y variables locales en sus pilas. Solo interferirán entre sí si las cosas en sus pilas apuntan a los mismos objetos en el montón. En cuyo caso podrían suceder todo tipo de cosas. Pero como señala Hans, las cadenas son inmutables (no se pueden cambiar), así que estamos seguros si este es el único objeto que se "comparte".
Muchos subprocesos pueden ejecutar el mismo método. Es posible que no se estén ejecutando al mismo tiempo; depende de cuántos núcleos tenga en su máquina, ya que la JVM asigna subprocesos de Java a subprocesos del sistema operativo, que están programados en subprocesos de hardware. Por lo tanto, tiene poco control sobre la forma en que estos hilos se entrelazan sin utilizar mecanismos de sincronización complejos .
Tenga en cuenta que dormir es algo que un hilo se hace a sí mismo.
fuente
No, ejecutar un hilo no afecta a otros hilos siempre que no se sincronicen intencionadamente entre sí. Si tiene más de un núcleo de procesador, todas las máquinas recientes lo tienen, es probable que esos subprocesos se ejecuten exactamente al mismo tiempo. Eso es un poco menos probable cuando inicia 5 subprocesos, ya que es posible que su máquina no tenga suficientes núcleos. El sistema operativo se ve obligado a elegir entre ellos, dándoles algo de tiempo para que se ejecuten. El trabajo del programador de subprocesos. Entonces, un hilo no estará en un estado de "suspensión", simplemente estará en pausa y esperando que el programador del hilo le dé la oportunidad de ejecutarse. Se reanudará donde fue interrumpido por el programador.
No existe tal posibilidad, los subprocesos tienen su propia pila, por lo que cualquier argumento de método y variable local será único para cada subproceso. Además, el uso de una cadena garantiza que estos hilos no puedan interferir entre sí, ya que las cadenas son inmutables.
No existe tal garantía si el argumento es una referencia a otro tipo de objeto mutable. O si el método en sí usa variables que son estáticas o referencias a objetos en el montón. La sincronización es necesaria cuando un hilo modifica el objeto y otro hilo lo lee. La palabra clave de bloqueo en el lenguaje C # es la forma estándar de implementar dicha sincronización requerida. El hecho de que el método sea estático no significa que dicha sincronización nunca sea necesaria. Es menos probable, ya que no tiene que preocuparse de que los hilos accedan al mismo objeto (compartir esto ).
fuente