Synchronisering i Java

Hva er Synchronisering i Java?

In Java, refererer synkronisering til muligheten til รฅ kontrollere tilgangen til flere trรฅder til en hvilken som helst delt ressurs. Det er et ideelt alternativ der vi รธnsker รฅ la bare รฉn trรฅd fรฅ tilgang til den delte ressursen.

Denne tilnรฆrmingen til utfรธrelse blir vanligvis referert til som "asynkron" programmering. Det er ogsรฅ trรฅder pรฅ disse prosessorene, som er lette prosesser som kan utfรธre instruksjoner samtidig.

Typer av Synchronisering

Det er to typer synkroniseringsmetoder i Java:

1) Prosesssynkronisering

2) Trรฅdsynkronisering.

La oss studere trรฅd og Prosesssynkronisering i detalj.

Prosesssynkronisering: Den administrerer synkronisering mellom programmer. For eksempel programmer som `Microsoft Word` og `Acrobat reader` kjรธres som individuelle prosesser.

Trรฅdsynkronisering: Samtidig utfรธrelse av den kritiske ressursen av to eller flere trรฅder kalles trรฅd Synchronisering. Du kan grupperes videre til gjensidig utelukkende kommunikasjon og kommunikasjon mellom trรฅder.

Hva er Lock in Java?

Lรฅse inn Java er bygget rundt en intern enhet kjent som en monitor eller lรฅsen. Alle objektene har en lรฅs knyttet til seg. Sรฅ trรฅden som trenger konsekvent tilgang til et objekts felt, mรฅ skaffe seg objektets lรฅs fรธr den fรฅr tilgang til dem, og den frigjรธr lรฅsen nรฅr arbeidet er ferdig. Dette sikrer at bare รฉn trรฅd fรฅr tilgang til de delte dataene om gangen.

Flertrรฅds program med synkronisering

Et flertrรฅds program er en metode eller blokk beskyttet mot forstyrrelser fra andre trรฅder som deler den samme ressursen som er angitt med nรธkkelordet "synkronisert".

Bruker den synkroniserte metoden

Enhver metode som er erklรฆrt som synkronisert er kjent som en synkronisert metode. Den brukes ogsรฅ til รฅ lรฅse et objekt for enhver delt ressurs. Sรฅ nรฅr en trรฅd pรฅkaller en synkronisert metode. Den tar automatisk lรฅsen for det objektet i besittelse og slipper den nรฅr den har fullfรธrt oppgaven.

OBS: Det synkroniserte nรธkkelordet kan ikke fungere med klasser og variabler. Bare metoder og blokker kan brukes med nรธkkelordet.

Hvorfor bruke Synchronisert metode?

  • Den brukes til รฅ lรฅse et objekt for eventuelle delte ressurser.
  • Objektet fรฅr lรฅsen hver gang den synkroniserte metoden kalles.
  • Lรฅsen frigjรธres ikke fรธr trรฅden fullfรธrer sin funksjon

Syntaks:

Acess_modifiers synchronized return_type method_name (Method_Parameters) {
}
class MathService {
    synchronized void getSumOfArray(int[] numbers) {
     int sum = 0;

         for (int number : numbers) {
             System.out.println(Thread.currentThread()
                     .getName()
                     + " adds "
                     + sum + " to "
                     + number + " to get -> "
                     + (sum += number));

             try {
                 Thread.sleep(500);
             } catch (InterruptedException e) {
                 throw new RuntimeException(e);
             }
         }
    }
}
public class Synchronization {
    public static void main(String[] args) {
        MathService mathService = new MathService();

        Thread threadOne = new Thread(() ->
                mathService.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadTwo = new Thread(() ->
                mathService.getSumOfArray(new int[]{20, 21, 22}));

        threadOne.start();
        threadTwo.start();
    }
}

Forklaring til Code:

Kjรธr dette eksemplet og observer at trรฅden `0` fรฅr lรฅsen til `mathService`-objektet fรธrst og bruker denne lรฅsen utelukkende til den er fullfรธrt. Trรฅd "0" og "1" er ikke sammenflettet i denne koden. Utgangen er som vist nedenfor.

Utgang:

Thread-0 adds 0 to 10 to get -> 10
Thread-0 adds 10 to 11 to get -> 21
Thread-0 adds 21 to 12 to get -> 33
Thread-1 adds 0 to 20 to get -> 20
Thread-1 adds 20 to 21 to get -> 41
Thread-1 adds 41 to 22 to get -> 63

Bruke en synkronisert blokk

La oss anta at du ikke vil synkronisere hele metoden. I stedet vil du synkronisere noen fรฅ linjer med kode. Pรฅ den tiden var Synchronisert blokk bidro til รฅ synkronisere den valgte Java kode. Synchroniserte metodelรฅser fรฅr tilgang pรฅ metoden, mens synkroniserte blokklรฅser fรฅr tilgang pรฅ objektet.

class MathService {
    void getSumOfArray(int[] numbers) {
        synchronized (this){
            int sum = 0;

            for (int number : numbers) {
                System.out.println(Thread.currentThread()
                        .getName()
                        + " adds "
                        + sum + " to "
                        + number + " to get -> "
                        + (sum += number));

                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}
public class Synchronization {
    public static void main(String[] args) {
        MathService mathService = new MathService();

        Thread threadOne = new Thread(() ->
                mathService.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadTwo = new Thread(() ->
                mathService.getSumOfArray(new int[]{20, 21, 22}));

        threadOne.start();
        threadTwo.start();
    }
}

Code Forklaring:

Nรฅr du kjรธrer denne koden, vil du merke at den fungerer uten forstyrrelser. I den synkroniserte metoden brukes lรฅsen av metoden, men i den synkroniserte blokken brukes lรฅsen av objektet. Sรธrg for at utgangen er som vist nedenfor.

Utgang:

Thread-0 adds 0 to 10 to get -> 10
Thread-0 adds 10 to 11 to get -> 21
Thread-0 adds 21 to 12 to get -> 33
Thread-1 adds 0 to 20 to get -> 20
Thread-1 adds 20 to 21 to get -> 41
Thread-1 adds 41 to 22 to get -> 63

Forklaring av kode:

Nรฅr du kjรธrer denne koden, vil du merke at den fungerer uten forstyrrelser, noe vi forventet. I den synkroniserte metoden brukes lรฅsen av metoden, men i den synkroniserte blokkeringsmetoden brukes lรฅsen av objektet.

Bruker statisk synkronisering

In Java synkronisering, hvis det er mer enn ett objekt, kan to trรฅder skaffe lรฅsene og gรฅ inn i en synkronisert blokk eller blokk, med en separat lรฅs for hvert objekt. For รฅ unngรฅ dette kan statisk synkronisering brukes. Synchroniserte sรธkeord vil bli brukt fรธr statiske metoder.

OBS: Ved statisk synkronisering er lรฅstilgang pรฅ klassen, ikke objektet og metoden.

Code for รฅ demonstrere problemet med at flere objekter lรฅses

class MathService {
    synchronized void getSumOfArray(int[] numbers) {
            int sum = 0;

            for (int number : numbers) {
                System.out.println(Thread.currentThread()
                        .getName()
                        + " adds "
                        + sum + " to "
                        + number + " to get -> "
                        + (sum += number));

                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
    }
}
public class Synchronization {
    public static void main(String[] args) {
        MathService mathService = new MathService();
        MathService mathService1 = new MathService();

        Thread threadOne = new Thread(() ->
                mathService.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadTwo = new Thread(() ->
                mathService.getSumOfArray(new int[]{20, 21, 22}));
        Thread threadThree = new Thread(() ->
                mathService1.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadFour = new Thread(() ->
                mathService1.getSumOfArray(new int[]{20, 21, 22}));

        threadOne.start();
        threadTwo.start();
        threadThree.start();
        threadFour.start();
    }
}

Forklaring av kode:

Nรฅr vi oppretter en annen forekomst av `MathService`, introduserer vi interferens i trรฅdene ettersom de vil bli sammenflettet med de to objektene. Merk at trรฅd `0` og trรฅd `2` er sammenflettet med de to objektene, mens trรฅd `1` og `3` er sammenflettet med de to objektene.

Utgang:

Thread-0 adds 0 to 10 to get -> 10
Thread-2 adds 0 to 10 to get -> 10
Thread-0 adds 10 to 11 to get -> 21
Thread-2 adds 10 to 11 to get -> 21
Thread-0 adds 21 to 12 to get -> 33
Thread-2 adds 21 to 12 to get -> 33
Thread-1 adds 0 to 20 to get -> 20
Thread-3 adds 0 to 20 to get -> 20
Thread-1 adds 20 to 21 to get -> 41
Thread-3 adds 20 to 21 to get -> 41
Thread-1 adds 41 to 22 to get -> 63
Thread-3 adds 41 to 22 to get -> 63

Samme kode ved hjelp av synkronisert statisk metode

class MathService {
    synchronized static void getSumOfArray(int[] numbers) {
            int sum = 0;

            for (int number : numbers) {
                System.out.println(Thread.currentThread()
                        .getName()
                        + " adds "
                        + sum + " to "
                        + number + " to get -> "
                        + (sum += number));

                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
    }
}
public class Synchronization {
    public static void main(String[] args) {
        MathService mathService = new MathService();
        MathService mathService1 = new MathService();

        Thread threadOne = new Thread(() ->
                mathService.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadTwo = new Thread(() ->
                mathService.getSumOfArray(new int[]{20, 21, 22}));
        Thread threadThree = new Thread(() ->
                mathService1.getSumOfArray(new int[]{10, 11, 12}));
        Thread threadFour = new Thread(() ->
                mathService1.getSumOfArray(new int[]{20, 21, 22}));

        threadOne.start();
        threadTwo.start();
        threadThree.start();
        threadFour.start();
    }
}

Kjรธr koden ovenfor og merk at vi nรฅ har eliminert trรฅdinterferens. Utgangen av koden er vist nedenfor.

Utgang:

Thread-0 adds 0 to 10 to get -> 10
Thread-0 adds 10 to 11 to get -> 21
Thread-0 adds 21 to 12 to get -> 33
Thread-3 adds 0 to 20 to get -> 20
Thread-3 adds 20 to 21 to get -> 41
Thread-3 adds 41 to 22 to get -> 63
Thread-2 adds 0 to 10 to get -> 10
Thread-2 adds 10 to 11 to get -> 21
Thread-2 adds 21 to 12 to get -> 33
Thread-1 adds 0 to 20 to get -> 20
Thread-1 adds 20 to 21 to get -> 41
Thread-1 adds 41 to 22 to get -> 63

Fordeler med รฅ bruke synkronisering

Her er fordelene ved รฅ jobbe med samtidige applikasjoner:

  • Hovedmรฅlet med synkronisering i Java er รฅ forhindre inkonsistente data ved รฅ forhindre trรฅdinterferens.
  • Det synkroniserte nรธkkelordet i Java gir lรฅsing, som sikrer gjensidig utelukkende tilgang til den delte ressursen og forhindrer dataras.
  • Det forhindrer ogsรฅ omorganisering av kodesetninger av kompilatoren, som kan forรฅrsake et subtilt samtidig problem hvis vi ikke bruker flyktige eller synkroniserte sรธkeord.
  • Synchronisert nรธkkelord leser data fra hovedminnet enn cache og nรฅr det slipper lรฅsen.
  • Den fjerner ogsรฅ skriveoperasjoner fra hovedminnet, og eliminerer minneinkonsistensfeil.

Ulemper med Synchroniseringsmekanisme

Synchroniseringsmekanismer har dรฅrlig ytelse.

For eksempel

  • Anta at det er fem prosesser, A1, A2, A3, A4 og A5.
  • De venter pรฅ at de delte ressursene skal fรฅ tilgang til รฉn trรฅd om gangen.
  • Alle prosesser holdes ventende, sรฅ den siste i kรธen mรฅ vente til alle andre prosesser er fullfรธrt.

Sammendrag

  • Synchronisering refererer til muligheten til รฅ kontrollere tilgangen til flere trรฅder til en hvilken som helst delt ressurs.
  • Java har to typer synkroniseringsmetoder: 1) Prosesssynkronisering og 2) Trรฅdsynkronisering.
  • Lรฅse inn Java er bygget rundt en intern enhet kjent som en monitor eller lรฅsen.
  • Et multithreaded-program er en metode eller blokk beskyttet mot forstyrrelser fra andre trรฅder som deler den samme ressursen som er angitt med nรธkkelordet "synkronisert".
  • Enhver metode som er erklรฆrt som synkronisert er kjent som en synkronisert metode.
  • In Java, synkroniserte metodelรฅser fรฅr tilgang pรฅ metoden, mens synkroniserte blokklรฅser fรฅr tilgang til objektet.
  • Ved statisk synkronisering er lรฅstilgang pรฅ klassen, ikke objektet og metoden.
  • Hovedmรฅlet med synkronisering i Java er รฅ forhindre inkonsistente data ved รฅ forhindre trรฅdinterferens.
  • Den stรธrste ulempen med denne metoden er at alle prosesser holdes i vente, sรฅ den siste i kรธen mรฅ vente til alle andre prosesser er fullfรธrt.

Oppsummer dette innlegget med: