[Notas de lectura de arte para la programación concurrente] Comprensión de cómo Java ejecuta subprocesos múltiples desde el mapa de memoria

Comprender cómo Java ejecuta subprocesos múltiples desde el gráfico de memoria

1. Introducción al gráfico de memoria

Como todos sabemos, las variables miembro de la clase Java se guardarán en el área de métodos y el método de tiempo de ejecución de Java se almacenará en la pila. Luego, las variables locales del método también se almacenarán en la pila y el tipo de referencia (objeto nuevo) se almacenará en la memoria del montón. A continuación se utiliza el área de método, la memoria de pila y la memoria de montón en la memoria de Java para demostrar el proceso de ejecución del método de Java.

inserte la descripción de la imagen aquí

Primero defina una clase de Persona.

public class Person {
    
    
    public int age;
    public String name;
    
	public void m1() {
    
    
	}
	public void m2() {
    
    
		m3();
	}
	public void m3() {
    
    
	}
	
	public static void m4() {
    
    
	}
}

En este punto, nuestro mapa de memoria se ve así

inserte la descripción de la imagen aquí

Definir otra clase de prueba

public class Test {
    
    
	public static void main(String[] args) throws Exception{
    
    
		Person person1 = new Person();
		person1.m1();
	}
}

En este punto, nuestro mapa de memoria se ve así

inserte la descripción de la imagen aquí

2. Modo de ejecución de código de un solo subproceso

Después de iniciar la clase de prueba, cree una pila de subprocesos principal y cree un objeto person1 (almacenado en la memoria del montón y solo contiene miembros no estáticos en la clase)
inserte la descripción de la imagen aquí

Luego, el objeto person1 llama al método m1, y la pila de subprocesos principal copia una copia del método m1 de la dirección del objeto person1 en la memoria del montón y la empuja a la pila.

inserte la descripción de la imagen aquí

Después de que se ejecuta m1, el método m1 se extrae de la pila, el contenido de todo el subproceso principal finaliza, los métodos se extraen de la pila uno por uno y las referencias de objetos creadas se destruyen.

inserte la descripción de la imagen aquí

El objeto person1 en la memoria del montón se reciclará si no se hace referencia a él en otro lugar.

inserte la descripción de la imagen aquí

El método principal se ejecuta

3. Modo de ejecución de código de subprocesos múltiples

Ajuste la clase de prueba para permitir que participen varios subprocesos

public class Test {
    
    
	public static void main(String[] args) throws Exception{
    
    
		Thread thread1 = new Thread() {
    
    
			@Override
			public void run() {
    
    
				Person person1 = new Person();
				person1.m2();
			}
		};
		Thread thread2 = new Thread() {
    
    
			@Override
			public void run() {
    
    
				Person person1 = new Person();
				person1.m3();
			}
		};
		// -----------------------

		thread1.start();
		thread2.start();
		
		Person person1 = new Person();
		person1.m1();
	}
}

El mapa de memoria al ejecutar hasta la línea divisoria es el siguiente

inserte la descripción de la imagen aquí

Luego ejecute el método de inicio para lanzar el hilo en la cola lista

inserte la descripción de la imagen aquí

Dado que los subprocesos 1 y 2 entran en el estado listo. La CPU puede asignar intervalos de tiempo en cualquier momento para que se ejecute, por lo que no se puede determinar el orden de creación de person1 en thread1 y thread2 y la creación de objetos person1 en el hilo principal. Puede ser que el objeto de person1 en el subproceso principal se haya ejecutado después de que se recicla el método, thread1 y subproceso 2 comienzan a crearse, o pueden existir tres objetos person1 al mismo tiempo.

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_51383106/article/details/131678878
Recomendado
Clasificación