Java >> Tutoriel Java >  >> Java

Synchronisation des threads en Java avec exemple

Dans la programmation multithread, plusieurs threads s'exécutent simultanément et accèdent à des ressources communes. Pour éviter les blocages, nous devons nous assurer qu'une ressource doit être partagée par un thread à la fois, sinon cela peut produire un résultat étrange ou imprévu. Ce processus est connu sous le nom de synchronisation. Dans cet article, nous discuterons de comment réaliser la synchronisation des threads en Java ?

Comprenons cela en prenant un exemple. Il y a deux threads qui accèdent et écrivent dans le fichier commun output.txt. Si aucune synchronisation n'est utilisée, un thread écrit quelques mots dans le fichier et pendant ce temps un autre thread commence à écrire dans le fichier. Le fichier résultant contiendra un contenu aléatoire écrit par les deux threads. Avec la synchronisation, si un thread écrit dans le fichier, le fichier sera verrouillé (en mode LOCK) et aucun autre thread ou processus ne pourra y accéder tant que le premier thread n'aura pas terminé son travail.

Considérez le code, sans synchronisation,

class print{
     public void printMSG(String s){
        for(int i=1;i<=5;i++) {
            System.out.println(s);
            try {
                Thread.sleep(1000);        // used to sleep current execution for 1s
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
}
class one extends Thread{
    print t;
    one(print t){
        this.t=t;
    }
    public void run(){
       t.printMSG("Hi");
    }
}
class two extends Thread{
    print t;
    two(print t){
        this.t=t;
    }

    public void run() {
        t.printMSG("Bye");
    }
}


public class ExSynchronization {
    public static void main(String[] args) {
        print t=new print();
        one ob=new one(t);
        two o2=new two(t);
        ob.start();
        o2.start();
    }
}

Sortie

Hi
Bye
Bye
Hi
Hi
Bye
Hi
Bye
Hi
Bye

Remarque : Cette sortie est aléatoire.

Dans ce programme, nous avons conçu deux threads qui accèdent à une fonction commune printMSG(). Lorsque nous exécutons ce code, nous pouvons obtenir la sortie indésirable comme indiqué ci-dessus.

Pour synchroniser la sortie, nous utiliserons la méthode synchronisée. Cela verrouillera l'objet pour une ressource partagée. Nous pouvons le faire en ajoutant un mot-clé synchronisé à la méthode partagée.

Laissez voir le code synchronisé ci-dessous,

class print{
     synchronized public void printMSG(String s){
        for(int i=1;i<=5;i++) {
            System.out.println(s);
            try {
                Thread.sleep(1000);     // used to sleep current execution for 1s
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
}
class one extends Thread{
    print t;
    one(print t){
        this.t=t;
    }
    public void run(){
       t.printMSG("Hi");
    }
}
class two extends Thread{
    print t;
    two(print t){
        this.t=t;
    }

    public void run() {
        t.printMSG("Bye");
    }
}


public class ExSynchronization {
    public static void main(String[] args) {
        print t=new print();
        one ob=new one(t);
        two o2=new two(t);
        ob.start();
        o2.start();
    }
}

Sortie

Hi
Hi
Hi
Hi
Hi
Bye
Bye
Bye
Bye
Bye

Remarque : Les discussions peuvent commencer dans n'importe quel ordre.


Balise Java