son - Comportamiento del método estático en entornos de subprocesos múltiples en Java
metodo estatico definicion (2)
¿Va a dormir?
No, ejecutar un hilo no afecta a otros hilos, siempre que no se sincronicen intencionalmente entre sí. Si tiene más de un núcleo de procesador, todas las máquinas recientes lo hacen, esos hilos probablemente se ejecutarán al mismo tiempo. Eso se vuelve menos probable cuando comienzas 5 hilos ya que tu máquina podría no tener suficientes núcleos. El sistema operativo está forzado a elegir entre ellos, dándoles a cada uno algo de tiempo para ejecutar. El trabajo del programador de hilos. Un hilo no estará en estado de "suspensión", simplemente se pausa y espera a que el programador de hilos le dé la oportunidad de ejecutarse. Se reanudará donde fue interrumpido por el programador.
¿Hay alguna posibilidad de intercambiar el inFileStr enviado por múltiples hilos?
No existe tal posibilidad, los hilos tienen su propia pila, por lo que cualquier argumento de método y variable local será único para cada hilo. Usar una cadena además garantiza que estos hilos no pueden interferir entre sí ya que las cadenas son inmutables.
No hay tal garantía si el argumento es una referencia a otro tipo de objeto mutable. O si el método en sí mismo usa variables que son estáticas o referencias a objetos en el montón. Se requiere sincronización cuando un hilo modifica el objeto y otro hilo lo lee. La palabra clave de bloqueo en el lenguaje C # es la manera estándar de implementar dicha sincronización requerida. El hecho de que el método sea estático no significa que nunca se requiera dicha sincronización. Es menos probable ya que no tiene que preocuparse por los subprocesos que acceden al mismo objeto (compartiendo esto ).
Hay una simple pregunta estúpida que me molesta y me hace pensar en varios argumentos. Quiero descartar todas las dudas sobre las preguntas a continuación.
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 hilos ejecutando cada uno una llamada a Clstest.testStaticMethod("arg-n")
al mismo tiempo.
El hilo 1 llama a Clstest.testStaticMethod("arg-1")
.
Cuando el hilo 1 está en la sección 1, el hilo 2 llama a Clstest.testStaticMethod("arg-2")
.
Entonces, ¿qué pasará con el Tema 1? ¿Va a dormir?
Cuando Thread 1 tuvo la oportunidad, ¿continuará la ejecución desde la sección 1, donde se detuvo?
¿Cómo sucede cuando hay un Clstest.testStaticMethod
y el mismo Clstest.testStaticMethod
se comparte entre los cinco hilos?
¿Hay alguna posibilidad de intercambiar el inFileStr
enviado por múltiples hilos?
La respuesta de Hans Passant es buena. Pero pensé que intentaría explicar 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 en ese método en su propia pila. Algunos de estos valores pueden ser indicadores de objetos en el montón. Si dos subprocesos ejecutan 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 stacks. Solo interferirán entre sí si las cosas en sus stacks apuntan a los mismos objetos en el montón. En ese caso, todo tipo de cosas podría suceder. Pero como señala Hans, las cadenas son inmutables (no se pueden cambiar) por lo que estamos seguros si este es el único objeto que se "comparte".
Muchos hilos pueden estar ejecutando 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 JVM correlaciona los hilos de Java con los hilos del SO, que están programados en los hilos del hardware. Por lo tanto, tiene poco control sobre la forma en que estos subprocesos se entrelazan sin utilizar mecanismos de sincronización complejos.
Tenga en cuenta que dormir es algo que un hilo se hace a sí mismo.