Maison > Java > javaDidacticiel > Java : explication détaillée du verrouillage d'objet 'synchronisé' et du verrouillage global

Java : explication détaillée du verrouillage d'objet 'synchronisé' et du verrouillage global

php是最好的语言
Libérer: 2018-08-03 11:20:25
original
2729 Les gens l'ont consulté

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();
	}
}
Copier après la connexion

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执行结束
Copier après la connexion

É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();
	}
}
Copier après la connexion

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();
	}
}
Copier après la connexion

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();
	}
}
Copier après la connexion

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();
	}
}
Copier après la connexion

Articles connexes :

Exemple de partage de code du verrou de synchronisation Java (synchronisé)

Explication détaillée du mot-clé synchronisé dans Problèmes de blocage Java et d'utilisation de la mémoire

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal