Regardons d'abord un morceau de code :
class MyThread implements Runnable{ private int count = 10; @Override public void run() { while(count > 0) { System.out.println(Thread.currentThread().getName() + "开始执行"); System.out.println("count还剩" + --count); System.out.println(Thread.currentThread().getName() + "执行结束"); System.out.println(); } } } public class Test{ public static void main(String[] args) { MyThread myThread = new MyThread(); new Thread(myThread).start(); new Thread(myThread).start(); new Thread(myThread).start(); } }
Le résultat en cours d'exécution est le suivant :
Thread-0开始执行 Thread-2开始执行 Thread-1开始执行 count还剩8 count还剩9 Thread-2执行结束 count还剩7 Thread-1执行结束 Thread-1开始执行 Thread-0执行结束 Thread-0开始执行 count还剩5 Thread-0执行结束 Thread-2开始执行 count还剩4 Thread-2执行结束 Thread-2开始执行 count还剩3 count还剩6 Thread-2执行结束 Thread-2开始执行 Thread-0开始执行 count还剩2 Thread-2执行结束 Thread-2开始执行 count还剩0 Thread-2执行结束 Thread-1执行结束 count还剩1 Thread-0执行结束
Évidemment, ce n'est pas le résultat que nous voulons, le résultat que nous voulons est : a Exécuter complètement sa propre méthode run() dans l'ordre, mais le résultat ci-dessus est dans le désordre : le deuxième thread est arrivé avant que le thread précédent n'ait terminé sa tâche. Alors comment résoudre ce problème ?
Tout d'abord, analysons que trois threads obtiennent l'objet myThread que nous avons créé en même temps, puis démarrons ces trois threads. Ces trois threads entreront dans la méthode run() en même temps pour l'exécution. Si nous voulons que chaque thread termine sa tâche après son entrée, nous devons verrouiller l'objet myThread et empêcher les autres threads de l'obtenir. Par exemple, s'il y a une pièce, après y être entré, si vous ne voulez pas que d'autres personnes entrent à nouveau, vous devez verrouiller la porte.
Java nous fournit un verrou dit "synchronisé". Alors comment l’utiliser ?
Deux modes de « synchronisé » : méthode synchronisée et bloc de code synchronisé.
1. Verrouillage d'objet :
1. Bloc de code synchronisé : Ajoutez synchronisé (l'objet à verrouiller) devant le bloc de code.
class MyThread implements Runnable{ private int count = 10; @Override public void run() { synchronized (this) { while(count > 0) { System.out.println(Thread.currentThread().getName() + "开始执行"); System.out.println("count还剩" + --count); System.out.println(Thread.currentThread().getName() + "执行结束"); System.out.println(); } } } } public class Test{ public static void main(String[] args) { MyThread myThread = new MyThread(); new Thread(myThread).start(); new Thread(myThread).start(); new Thread(myThread).start(); } }
2. Méthode synchronisée : Ajoutez le mot-clé synchronisé devant la valeur de retour de la méthode.
class MyThread implements Runnable{ private int count = 10; @Override public void run() { while(count > 0) { count--; fun(); } } public synchronized void fun() { System.out.println(Thread.currentThread().getName() + "开始执行"); System.out.println("count还剩" + count); System.out.println(Thread.currentThread().getName() + "执行结束"); System.out.println(); } } public class Test{ public static void main(String[] args) { MyThread myThread = new MyThread(); new Thread(myThread).start(); new Thread(myThread).start(); new Thread(myThread).start(); } }
2. Verrouillage global :
Ci-dessus, nous verrouillons tous les objets myThread. Et si nous voulons verrouiller la même méthode de plusieurs objets ?
Il existe également deux méthodes avec verrouillage d'objet : la méthode synchronisée et le bloc de code synchronisé.
1. Entre parenthèses avant le bloc de code de synchronisation, écrivez la classe de la méthode que vous souhaitez verrouiller
class MyThread implements Runnable{ private static int count = 10; @Override public void run() { synchronized (MyThread.class) { while(count > 0) { count--; fun(); } } } public void fun() { System.out.println(Thread.currentThread().getName() + "开始执行"); System.out.println("count还剩" + count); System.out.println(Thread.currentThread().getName() + "执行结束"); System.out.println(); } } public class Test{ public static void main(String[] args) { MyThread myThread = new MyThread(); new Thread(myThread).start(); new Thread(myThread).start(); new Thread(myThread).start(); } }
2. ajoutez un mot-clé statique, vous pouvez obtenir un verrouillage global.
class MyThread implements Runnable{ private static int count = 10; @Override public void run() { while(count > 0) { fun(); } } public synchronized static void fun() { System.out.println(Thread.currentThread().getName() + "开始执行"); System.out.println("count还剩" + count); System.out.println(Thread.currentThread().getName() + "执行结束"); System.out.println(); count--; } } public class Test{ public static void main(String[] args) { MyThread myThread = new MyThread(); new Thread(myThread).start(); new Thread(myThread).start(); new Thread(myThread).start(); } }
Articles connexes :
Exemple de partage de code du verrou de synchronisation Java (synchronisé)
Vidéos associées :
Analyse complète des annotations Java
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!