[Notes de lecture d'art pour la programmation simultanée] Comprendre comment Java exécute le multithreading à partir de la carte mémoire

Comprendre comment Java exécute le multithreading à partir du graphique de la mémoire

1. Introduction au graphe mémoire

Comme nous le savons tous, les variables membres de la classe Java seront enregistrées dans la zone de méthode et la méthode d'exécution Java sera stockée dans la pile.Ensuite, les variables locales de la méthode sont également stockées dans la pile et le type de référence (nouvel objet) est stocké dans la mémoire du tas. Ce qui suit utilise la zone de méthode, la mémoire de pile et la mémoire de tas dans la mémoire java pour illustrer le processus d'exécution de la méthode java.

insérez la description de l'image ici

Définissez d'abord une classe Person.

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

À ce stade, notre carte mémoire ressemble à ceci

insérez la description de l'image ici

Définir une autre classe de test

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

À ce stade, notre carte mémoire ressemble à ceci

insérez la description de l'image ici

2. Mode d'exécution de code monothread

Après avoir démarré la classe Test, créez une pile de threads principale et créez un objet person1 (stocké dans la mémoire de tas et ne transportant que des membres non statiques dans la classe)
insérez la description de l'image ici

Ensuite, l'objet person1 appelle la méthode m1 et la pile de threads principale copie une copie de la méthode m1 à partir de l'adresse de l'objet person1 dans le tas de mémoire et la pousse sur la pile.

insérez la description de l'image ici

Après l'exécution de m1, la méthode m1 est extraite de la pile, le contenu de l'ensemble du thread principal se termine, les méthodes sont extraites de la pile une par une et les références d'objet créées sont détruites.

insérez la description de l'image ici

L'objet person1 dans la mémoire de tas sera recyclé s'il n'est pas référencé ailleurs.

insérez la description de l'image ici

La méthode principale est exécutée

3. Mode d'exécution de code multithread

Ajustez la classe Test pour permettre à plusieurs threads de participer

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();
	}
}

La carte mémoire lors de l'exécution de la ligne de division est la suivante

insérez la description de l'image ici

Exécutez ensuite la méthode start pour jeter le thread dans la file d'attente prête

insérez la description de l'image ici

Puisque les threads 1 et 2 entrent tous les deux dans l'état prêt. Le processeur peut allouer des tranches de temps à tout moment pour le faire fonctionner, de sorte que l'ordre de création de person1 dans thread1 et thread2 et de création d'objets person1 dans le thread principal ne peut pas être déterminé. Il se peut que l'objet de person1 dans le thread principal ait été exécuté après le recyclage de la méthode, que thread1 et thread 2 commencent à créer, ou que trois objets person1 puissent exister en même temps.

insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/qq_51383106/article/details/131678878
conseillé
Classement