Introduction détaillée à l'utilisation du bloc synchronisé Java
Le bloc synchronisé Java est utilisé pour marquer des méthodes ou des blocs de code comme synchronisés. Les blocs synchronisés Java sont utilisés pour éviter les courses. Cet article présente le contenu suivant :
Mot-clé de synchronisation Java (synchronisé)
Synchronisation de méthode d'instance
Synchronisation de méthode statique
Bloc synchronisé en méthode d'instance
Bloc synchronisé en méthode statique
Exemple de synchronisation Java
Mot-clé de synchronisation Java (synchronisé)
Les blocs synchronisés en Java sont marqués par synchronisé. Un bloc synchronisé en Java est synchronisé sur un certain objet . Tous les blocs synchronisés sur un objet ne peuvent être saisis et exécutés que par un seul thread à la fois. Tous les autres threads en attente d'entrer dans ce bloc synchronisé seront bloqués jusqu'à ce que le thread exécutant ce bloc synchronisé quitte .
Il existe quatre blocs synchronisés différents :
Méthodes d'instance
Méthodes statiques
-
Blocs synchronisés dans les méthodes d'instance
Blocs synchronisés dans les méthodes statiques
Les blocs synchronisés ci-dessus sont tous synchronisés sur différents objets. Le bloc de synchronisation réellement nécessaire dépend de la situation.
Synchronisation de la méthode d'instance
Ce qui suit est une méthode d'instance synchronisée :
public synchronized void add(int value){ this.count += value; }
Notez le mot-clé synchronisé dans la déclaration de la méthode. Cela indique à Java que la méthode est synchrone.
La synchronisation des méthodes d'instance Java est synchronisée sur l'objet propriétaire de la méthode. De cette manière, la synchronisation des méthodes de chaque instance est synchronisée sur un objet différent, c'est-à-dire l'instance à laquelle appartient la méthode. Un seul thread peut s’exécuter dans un bloc synchronisé de méthode d’instance. S'il existe plusieurs instances, un thread peut effectuer des opérations dans un bloc synchronisé d'instance à la fois. Un thread par instance.
Synchronisation de méthode statique
La synchronisation de méthode statique est la même que la méthode de synchronisation de méthode d'instance et utilise également le mot-clé synchronisé. La synchronisation de la méthode statique Java est la suivante :
public static synchronized void add(int value){ count += value; }
De même, le mot-clé synchronisé indique ici à Java que cette méthode est synchronisée.
La synchronisation des méthodes statiques fait référence à la synchronisation sur l'objet de classe où se trouve la méthode. Étant donné qu'une classe ne peut correspondre qu'à un seul objet de classe dans la machine virtuelle Java, un seul thread est autorisé à exécuter simultanément des méthodes de synchronisation statique dans la même classe.
Pour les méthodes statiques synchronisées dans différentes classes, un thread peut exécuter les méthodes statiques synchronisées dans chaque classe sans attendre. Quelle que soit la méthode statique synchronisée appelée dans la classe, une classe ne peut être exécutée que par un seul thread à la fois.
Blocs synchronisés dans les méthodes d'instance
Parfois, vous n'avez pas besoin de synchroniser la méthode entière, mais une partie de celle-ci. Java peut synchroniser une partie d'une méthode.
Un exemple de bloc synchronisé dans une méthode Java asynchrone est le suivant :
public void add(int value){ synchronized(this){ this.count += value; } }
L'exemple utilise le constructeur de bloc synchronisé Java pour marquer un bloc de code comme synchronisé. Ce code s'exécute comme une méthode synchronisée.
Notez que le constructeur de bloc synchronisé Java entoure l'objet de parenthèses. Dans l'exemple ci-dessus, "this" est utilisé, qui est l'instance elle-même qui appelle la méthode add. L'objet entre parenthèses dans le constructeur synchronisé est appelé un objet moniteur. Le code ci-dessus utilise la synchronisation des objets de surveillance et la méthode d'instance synchronisée utilise l'instance de la méthode appelante elle-même comme objet de surveillance.
Un seul thread peut s'exécuter à la fois dans une méthode Java synchronisée avec le même objet moniteur.
Les deux exemples suivants synchronisent les objets d'instance qu'ils sont appelés, ils sont donc équivalents dans les effets d'exécution de synchronisation.
public class MyClass { public synchronized void log1(String msg1, String msg2){ log.writeln(msg1); log.writeln(msg2); } public void log2(String msg1, String msg2){ synchronized(this){ log.writeln(msg1); log.writeln(msg2); } } }
Dans l'exemple ci-dessus, un seul thread peut s'exécuter dans l'une ou l'autre méthode des deux blocs synchronisés à la fois.
Si le deuxième bloc de synchronisation n'est pas synchronisé sur cet objet instance, alors les deux méthodes peuvent être exécutées par le thread en même temps.
Blocs synchronisés dans les méthodes statiques
Similaire à ce qui précède, voici deux exemples de synchronisation de méthodes statiques. Ces méthodes sont synchronisées sur l'objet classe auquel appartient la méthode.
public class MyClass { public static synchronized void log1(String msg1, String msg2){ log.writeln(msg1); log.writeln(msg2); } public static void log2(String msg1, String msg2){ synchronized(MyClass.class){ log.writeln(msg1); log.writeln(msg2); } } }
Ces deux méthodes ne sont pas accessibles aux threads en même temps.
Si le deuxième bloc de synchronisation n'est pas synchronisé sur l'objet MyClass.class. Ensuite, ces deux méthodes sont accessibles par les threads en même temps.
Instance de synchronisation Java
Dans l'exemple suivant, deux threads sont démarrés, tous deux appelant la méthode add de la même instance de la classe Counter. La synchronisation étant effectuée sur l'instance à laquelle appartient la méthode, un seul thread peut accéder à la méthode en même temps.
public class Counter{ long count = 0; public synchronized void add(long value){ this.count += value; } } public class CounterThread extends Thread{ protected Counter counter = null; public CounterThread(Counter counter){ this.counter = counter; } public void run() { for(int i=0; i<10; i++){ counter.add(i); } } } public class Example { public static void main(String[] args){ Counter counter = new Counter(); Thread threadA = new CounterThread(counter); Thread threadB = new CounterThread(counter); threadA.start(); threadB.start(); } }
创建了两个线程。他们的构造器引用同一个Counter实例。Counter.add方法是同步在实例上,是因为add方法是实例方法并且被标记上synchronized关键字。因此每次只允许一个线程调用该方法。另外一个线程必须要等到第一个线程退出add()方法时,才能继续执行方法。
如果两个线程引用了两个不同的Counter实例,那么他们可以同时调用add()方法。这些方法调用了不同的对象,因此这些方法也就同步在不同的对象上。这些方法调用将不会被阻塞。如下面这个例子所示:
public class Example { public static void main(String[] args){ Counter counterA = new Counter(); Counter counterB = new Counter(); Thread threadA = new CounterThread(counterA); Thread threadB = new CounterThread(counterB); threadA.start(); threadB.start(); } }
注意这两个线程,threadA和threadB,不再引用同一个counter实例。CounterA和counterB的add方法同步在他们所属的对象上。调用counterA的add方法将不会阻塞调用counterB的add方法。
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds





Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.
