Guide de synchronisation en Java
Publié: 2022-10-23Avant d'expliquer la synchronisation en Java , nous devons brièvement revenir sur le concept de multithreading. La fonctionnalité 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é.
Consultez nos cours de technologie gratuits pour vous démarquer de la concurrence.
Ce guide sur ce qu'est la synchronisation en Java explorera le concept de synchronisation en détail avec des exemples.
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.
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.
Découvrez la certification avancée d'upGrad en DevOps
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
}
Explorez nos cours populaires de génie logiciel
Master of Science en informatique de LJMU & IIITB | Programme de certificat de cybersécurité Caltech CTME |
Bootcamp de développement de la pile complète | Programme PG dans Blockchain |
Programme exécutif PG en développement Full Stack | |
Voir tous nos cours ci-dessous | |
Cours de génie logiciel |
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.
Découvrez la certification avancée d'upGrad en cybersécurité
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.
Compétences en développement de logiciels à la demande
Cours JavaScript | Cours Java de base | Cours de Structures de Données |
Cours Node.js | Cours SQL | Cours de développement full stack |
Cours NFT | Cours DevOps | Cours Big Data |
Cours React.js | Cours de cybersécurité | Cours d'informatique en nuage |
Cours de conception de bases de données | Cours Python | Cours de crypto-monnaie |

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();
}
}
Lisez nos articles populaires liés au développement de logiciels
Comment implémenter l'abstraction de données en Java ? | Qu'est-ce que la classe interne en Java ? | Identificateurs Java : définition, syntaxe et exemples |
Comprendre l'encapsulation dans OOPS avec des exemples | Arguments de ligne de commande en C expliqués | Top 10 des fonctionnalités et caractéristiques du cloud computing en 2022 |
Polymorphisme en Java : concepts, types, caractéristiques et exemples | Packages en Java et comment les utiliser ? | Tutoriel Git pour les débutants : Apprenez Git à partir de zéro |
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.
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.
Voulez-vous apprendre les concepts de base de Java ? Le programme upGrad Executive Post Graduate Program in Software Development - Specialization in Full Stack Development est un programme en ligne de 7 semaines destiné aux débutants qui souhaitent explorer les carrières en développement de logiciels. Assistez à des cours en direct et interactifs, à des séances d'entraînement et à plus de 35 heures de contenu dispensé par des leaders de l'industrie pour obtenir un certificat d'achèvement de upGrad.
Inscrivez-vous aujourd'hui pour profiter des avantages exclusifs upGrad d'un soutien aux étudiants 24h/24 et 7j/7 et du réseautage de l'industrie !
Pourquoi utilisons-nous la synchronisation en Java ?
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.
Comment la synchronisation est-elle implémentée en Java ?
Java implémente la synchronisation en utilisant le concept de moniteurs avec un seul thread possédant un moniteur à un instant 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.
Qu'est-ce qu'un blocage en Java ?
L'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.