Guide complet de la synchronisation en Java

Publié: 2022-05-20

Avant d'expliquer la synchronisation en Java , nous devons brièvement revenir sur le concept de multithreading. La fonction multithreading de Java permet l'exécution simultanée de deux ou plusieurs parties d'un programme pour une utilisation maximale du processeur. Chaque partie d'un tel programme est un thread, et les threads sont des processus légers au sein d'un processus.

Désormais, plusieurs threads d'un programme peuvent essayer d'accéder aux mêmes ressources et produire des résultats inexacts. Il doit donc y avoir une certaine synchronisation pour s'assurer qu'un seul thread a accès aux ressources à un moment donné.

Ce guide sur ce qu'est la synchronisation en Java explorera le concept de synchronisation en détail avec des exemples.

Table des matières

Qu'est-ce que la synchronisation en Java ?

La synchronisation Java est la capacité de contrôler l'accès de plusieurs threads à une ressource partagée. Il est utile lorsque des programmes Java multithread tentent d'accéder à la même ressource et produisent des résultats erronés. À l'aide de la fonction de synchronisation Java, un seul thread peut accéder à la ressource à un moment donné.

Java fournit un moyen de synchroniser la tâche des threads à l'aide de blocs synchronisés qui se synchronisent sur le même objet et ne peuvent avoir qu'un seul thread s'exécutant à l'intérieur à la fois. Ces blocs sont marqués avec le mot clé synchronized, bloquant tout autre thread tentant d'entrer dans le bloc synchronisé jusqu'à ce que le thread déjà à l'intérieur du bloc termine son exécution et quitte le bloc.

La syntaxe pour écrire un bloc synchronisé

La syntaxe générale pour écrire un bloc synchronisé en Java est la suivante :

synchronisé (lockObject)

{

// instructions synchronisées

}

Dans la syntaxe ci-dessus, lockObject fait référence à un objet dont le verrou est lié aux éléments synchronisés. Maintenant, cela nous amène au concept de verrouillage en Java.

Verrous en Java

La synchronisation en Java est construite autour du verrou ou du moniteur. Chaque objet a un verrou associé. Idéalement, un thread qui nécessite l'accès aux champs d'un objet doit d'abord obtenir le verrou de l'objet. Le verrou est un mécanisme de synchronisation de thread plus sophistiqué et flexible que le bloc de synchronisation. Il est défini dans le package java.util.concurrent.lock contenant des implémentations de verrouillage étendues.

Apprenez des cours de développement de logiciels en ligne dans les meilleures universités du monde. Gagnez des programmes Executive PG, des programmes de certificat avancés ou des programmes de maîtrise pour accélérer votre carrière.

Méthode synchronisée Java

Le but d'une méthode synchronisée Java est de verrouiller des objets pour des ressources partagées. Ainsi, lorsque les threads invoquent une méthode synchronisée, la méthode obtient automatiquement le verrou pour cet objet et le libère une fois que le thread a exécuté son travail.

Voici un exemple de méthode synchronisée Java :

//exemple de méthode synchronisée java

Tableau de classe{

synchronisé void printTable(int n){//méthode synchronisée

pour(int i=1;i<=5;i++){

System.out.println(n*i);

essayer{

Thread.sleep(400);

}catch(Exception e){System.out.println(e);}

}

}

}

la classe MyThread1 étend Thread{

Tablette;

MonThread1(Table t){

this.t=t ;

}

public void run(){

t.printTable(5);

}

}

la classe MyThread2 étend Thread{

Tablette;

MonThread2(Table t){

this.t=t ;

}

public void run(){

t.printTable(100);

}

}

classe publique TestSynchronization2{

public static void main(String args[]){

Table obj = new Table();//un seul objet

MyThread1 t1=new MyThread1(obj);

MyThread2 t2=new MyThread2(obj);

t1.start();

t2.start();

}

}

Production:

5

dix

15

20

25

100

200

300

400

500

Que se passe-t-il sans synchronisation ?

Maintenant, regardons le programme précédent sans synchronisation (notez l'absence du mot clé synchronized).

Tableau de classe{

void printTable(int n){//méthode non synchronisée

pour(int i=1;i<=5;i++){

System.out.println(n*i);

essayer{

Thread.sleep(400);

}catch(Exception e){System.out.println(e);}

}

}

}

la classe MyThread1 étend Thread{

Tablette;

MonThread1(Table t){

this.t=t ;

}

public void run(){

t.printTable(5);

}

}

la classe MyThread2 étend Thread{

Tablette;

MonThread2(Table t){

this.t=t ;

}

public void run(){

t.printTable(100);

}

}

classe TestSynchronisation1{

public static void main(String args[]){

Table obj = new Table();//un seul objet

MyThread1 t1=new MyThread1(obj);

MyThread2 t2=new MyThread2(obj);

t1.start();

t2.start();

}

}

Production:

5

100

dix

200

15

300

20

400

25

500

Comme vous pouvez le voir, la sortie est incohérente sans synchronisation.

Explorez nos cours populaires de génie logiciel

SL. Non Programmes de développement de logiciels
1 Master of Science en informatique de LJMU & IIITB Programme de certificat de cybersécurité Caltech CTME
2 Bootcamp de développement de la pile complète Programme PG dans Blockchain
3 Executive Post Graduate Program in Software Development - Spécialisation DevOps Voir tous les cours de génie logiciel

Types de synchronisation en Java

Pour répondre à ce qu'est la synchronisation des threads en Java , nous avons deux types de synchronisation disponibles : la synchronisation des threads et la synchronisation des processus.

Comprenons ce que chacun signifie.

Synchronisation des threads : lorsque plusieurs threads tentent d'accéder à une ressource partagée, nous devons nous assurer que la ressource n'est utilisée que par un seul thread à la fois. La synchronisation des threads est le processus qui permet à un seul thread d'utiliser la ressource partagée lorsque plusieurs threads tentent d'utiliser la ressource simultanément.

Synchronisation des processus : elle fait référence à l'exécution simultanée de plusieurs processus pour atteindre un état dans lequel les processus s'engagent dans un ordre d'exécution approprié. La synchronisation des processus est requise lorsque deux processus ou plus coopèrent et que l'exécution d'un processus affecte l'autre. Ainsi, la synchronisation des processus élimine la possibilité de sorties inexactes et garantit le bon ordre d'exécution.

Méthodes de synchronisation en Java

Globalement, il existe quatre méthodes de synchronisation en Java :

  • Méthodes statiques synchronisées
  • Méthodes d'instance synchronisées
  • Bloc synchronisé dans les méthodes statiques
  • Bloc synchronisé dans les méthodes d'instance

Examinons chaque méthode de synchronisation Java plus en détail.

Méthodes statiques synchronisées

Ici, nous utilisons le mot clé synchronized pour marquer les méthodes statiques en Java. Voici un exemple de méthode statique synchronisée Java :

public static MyStaticCounter {

nombre d'entiers statiques privés = 0 ;

incrément de vide synchronisé public statique (valeur int) {

compte += valeur ;

}

}

Méthodes d'instance synchronisées

Lors de l'utilisation d'un bloc synchronisé avec des méthodes d'instance, chaque objet a sa méthode synchronisée. Chaque objet ne peut avoir qu'un seul thread pouvant s'exécuter à l'intérieur d'une méthode. S'il y a plusieurs objets, un seul thread peut s'exécuter pour chaque objet à l'intérieur du bloc.

classe publique MonCompteur {

compte int privé = 0 ;

incrément de vide synchronisé public (valeur int) {

this.count += valeur ;

}

décrémentation de vide synchronisé public (valeur int) {

this.count -= valeur ;

}

}

Bloc synchronisé dans les méthodes statiques

Voici un exemple où nous utilisons un bloc synchronisé dans une méthode statique :

classe publique MaClasse {

impression vide statique publique (message de chaîne) {

synchronisé(MaClasse.classe) {

log.writeln(message);

}

}

}

Bloc synchronisé dans les méthodes d'instance

Au lieu de synchroniser toute la méthode, nous pouvons utiliser la synchronisation sur un bloc spécifique au sein de la méthode. Vous trouverez ci-dessous un exemple de bloc de code synchronisé dans une méthode non synchronisée :

public void incrément(valeur int) {

synchronisé(ceci) {

this.count += valeur ;

}

}

Besoin de synchronisation en Java

Maintenant que vous savez ce qu'est la synchronisation en Java , vous vous demandez peut-être pourquoi nous l'utilisons en premier lieu.

Le mot-clé Java synchronized fournit des fonctionnalités essentielles pour la programmation concurrente. Voici comment la synchronisation en Java aide :

  • La synchronisation Java fournit la fonction de verrouillage pour éliminer toute condition de concurrence entre les threads et garantir un accès mutuellement exclusif à la ressource partagée.
  • Le verrouillage synchronisé Java fournit à la fois les fonctions de verrouillage et de déverrouillage. Ainsi, un thread doit acquérir le verrou avant d'entrer dans une méthode ou un bloc synchronisé.
  • Le mot clé synchronized empêche la réorganisation des instructions de programme par le compilateur.

Conclusion

En résumé, la synchronisation en Java garantit qu'un seul thread peut accéder à la ressource partagée à la fois. Nous pouvons synchroniser un bloc ou une méthode à l'aide du mot-clé Java synchronized. Lorsqu'un thread veut entrer dans un bloc synchronisé, il doit acquérir un verrou, et après avoir quitté le bloc, le thread libère le verrou. Nous pouvons utiliser le mot clé synchronized soit avec des méthodes, soit à l'intérieur du bloc d'une méthode.

Vous vous demandez où apprendre Java ?

Certification PG liée à l'emploi d'upGrad en génie logiciel est ce que vous cherchez !

Spécialement conçue pour les nouveaux diplômés et les dernières années, la certification PG liée à l'emploi d'upGrad en génie logiciel est parfaite pour ceux qui veulent apprendre à programmer et se placer dans des rôles logiciels d'entrée de gamme. Ce programme en ligne de 5 mois enseignera les meilleures compétences logicielles telles que Java, JavaScript, HTML5, DSA, AWS, MERN, et plus encore !

Q : Pourquoi utilisons-nous la synchronisation en Java ?

R : Le mot clé synchronized en Java garantit qu'un seul thread peut accéder aux ressources partagées à la fois. Il est utile lorsque des programmes Java multithread tentent d'accéder à la même ressource et produisent des résultats inexacts.

Q : Comment la synchronisation est-elle implémentée en Java ?

R : Java implémente la synchronisation en utilisant le concept de moniteurs avec un seul thread possédant un moniteur à un moment donné. Lorsqu'un thread acquiert un verrou, il accède au moniteur et tous les autres threads tentant d'accéder au moniteur verrouillé restent bloqués jusqu'à ce que le premier thread quitte le moniteur.

Q : Qu'est-ce qu'un blocage en Java ?

R : Un interblocage Java se produit lorsqu'un thread attend un verrou d'objet, mais qu'un autre thread l'acquiert et que le deuxième thread attend un verrou d'objet acquis par le premier. Par conséquent, les deux threads attendent l'un de l'autre pour libérer le verrou, ce qui entraîne un blocage.