Maison >Java >javaDidacticiel >Synchronisation des threads Java et exclusion mutuelle : repartir de zéro, créer des programmes concurrents efficaces
La synchronisation des threads Java et l'exclusion mutuelle sont les clés de l'écriture de programmes concurrents efficaces. L'éditeur PHP Banana vous fera partir de zéro pour explorer le mécanisme de synchronisation des threads en Java, vous permettant de créer facilement des programmes simultanés efficaces et stables et d'améliorer la qualité et les performances du code.
En Java, la synchronisation des threads et l'exclusion mutuelle sont des techniques permettant de garantir qu'aucune course aux données ou autre incohérence ne se produit lorsque plusieurs threads partagent des données. La synchronisation des threads signifie que lorsque plusieurs threads accèdent à des données partagées, ils coordonnent leur accès via un mécanisme pour garantir la cohérence et l'intégrité des données. L'exclusion mutuelle des threads signifie qu'un seul thread peut accéder aux données partagées et que les autres threads ne peuvent qu'attendre.
Une variété de mécanismes de synchronisation de threads sont fournis en Java, dont les plus courants sont les verrous et les moniteurs. Les verrous sont un mécanisme de synchronisation de bas niveau qui permet à un thread d'acquérir un verrou avant d'entrer dans une section critique (c'est-à-dire le bloc de code où se trouvent les données partagées) et de libérer le verrou après avoir quitté la section critique. Le moniteur est un mécanisme de synchronisation avancé qui combine des verrous et des variables de condition afin que les threads puissent dormir en attendant le verrou jusqu'à ce qu'il soit libéré.
Pour mieux comprendre la synchronisation des threads Java et l'exclusion mutuelle, examinons un exemple de code simple. Dans cet exemple, nous avons deux threads accédant simultanément à une variable partagée. S'il n'y a pas de synchronisation des threads, il est très probable que deux threads modifient les variables partagées en même temps, entraînant une incohérence des données.
public class SimpleSyncDemo { private int sharedVariable = 0; public void incrementSharedVariable() { sharedVariable++; } public static void main(String[] args) { SimpleSyncDemo demo = new SimpleSyncDemo(); Thread thread1 = new Thread(() -> { for (int i = 0; i < 100000; i++) { demo.incrementSharedVariable(); } }); Thread thread2 = new Thread(() -> { for (int i = 0; i < 100000; i++) { demo.incrementSharedVariable(); } }); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Shared variable value: " + demo.sharedVariable); } }
Dans cet exemple, nous utilisons des verrous pour synchroniser les variables partagées. Nous créons d'abord un objet verrou, puis dans chaque thread, nous acquérons le verrou avant d'entrer dans la section critique et libérons le verrou après avoir quitté la section critique. De cette façon, nous garantissons qu'un seul thread peut accéder à la variable partagée, évitant ainsi les problèmes de course aux données.
L'exclusion mutuelle des threads Java signifie qu'un seul thread peut accéder aux données partagées et que les autres threads ne peuvent qu'attendre. Le moyen le plus simple d'obtenir une exclusion mutuelle de threads consiste à utiliser un verrou mutex (Mutex). Un mutex est un type spécial de verrou qui permet à un seul thread d'acquérir le verrou, et les autres threads ne peuvent qu'attendre que le verrou soit libéré.
Pour mieux comprendre le mutex du thread Java, regardons un exemple de code simple. Dans cet exemple, nous avons deux threads accédant simultanément à une variable partagée. S'il n'y a pas d'exclusion mutuelle des threads, il est très probable que deux threads modifient les variables partagées en même temps, ce qui entraîne une incohérence des données.
public class SimpleMutexDemo { private final Object lock = new Object(); private int sharedVariable = 0; public void incrementSharedVariable() { synchronized (lock) { sharedVariable++; } } public static void main(String[] args) { SimpleMutexDemo demo = new SimpleMutexDemo(); Thread thread1 = new Thread(() -> { for (int i = 0; i < 100000; i++) { demo.incrementSharedVariable(); } }); Thread thread2 = new Thread(() -> { for (int i = 0; i < 100000; i++) { demo.incrementSharedVariable(); } }); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Shared variable value: " + demo.sharedVariable); } }
Dans cet exemple, nous utilisons un verrou mutex pour obtenir une exclusion mutuelle des threads. Nous créons d'abord un objet mutex, puis dans chaque thread, nous acquérons le mutex avant d'entrer dans la section critique et libérons le mutex après avoir quitté la section critique. De cette façon, nous garantissons qu'un seul thread peut accéder à la variable partagée, évitant ainsi les problèmes de course aux données.
La synchronisation des threads et l'exclusion mutuelle sont des connaissances de base essentielles en JavaProgrammation simultanée. La maîtrise de ces technologies peut nous aider à écrire des programmes de concurrency efficaces et fiables. Dans cet article, nous avons présenté les bases de la synchronisation des threads Java et de l'exclusion mutuelle, et avons démontré, à travers des exemples de code, comment utiliser ces techniques pour écrire des programmes concurrents.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!