Synchronisering i Java

Hvad er Synchronisering i Java?

In Java, synkronisering refererer til evnen til at kontrollere adgangen af โ€‹โ€‹flere trรฅde til enhver delt ressource. Det er en ideel mulighed, hvor vi kun vil tillade รฉn trรฅd at fรฅ adgang til den delte ressource.

Denne tilgang til udfรธrelse omtales normalt som "asynkron" programmering. Der er ogsรฅ trรฅde pรฅ disse processorer, som er lette processer, der kan udfรธre instruktioner samtidigt.

Typer af Synchronisering

Der er to typer synkroniseringsmetoder i Java:

1) Processynkronisering

2) Trรฅdsynkronisering.

Lad os studere trรฅd og Processynkronisering i detaljer.

Processynkronisering: Det styrer synkronisering mellem programmer. For eksempel programmer som `Microsoft Word` og `Acrobat reader` kรธrer som individuelle processer.

Trรฅdsynkronisering: Den samtidige udfรธrelse af den kritiske ressource af to eller flere trรฅde kaldes trรฅd Synchronisering. Du kan grupperes yderligere til gensidigt udelukkende' og inter-trรฅdskommunikation.

Hvad er Lock in Java?

Fastlรฅse Java er bygget op omkring en intern enhed kendt som en skรฆrm eller lรฅsen. Alle objekter har en lรฅs forbundet med dem. Sรฅ trรฅden, der har brug for konsekvent adgang til et objekts felter, skal erhverve objektets lรฅs, fรธr den fรฅr adgang til dem, og den frigiver lรฅsen, nรฅr arbejdet er fรฆrdigt. Dette sikrer, at kun รฉn trรฅd fรฅr adgang til de delte data ad gangen.

Flertrรฅdet program med synkronisering

Et flertrรฅdet program er en metode eller blok, der er beskyttet mod interferens fra andre trรฅde, der deler den samme ressource angivet ved hjรฆlp af nรธgleordet `synkroniseret`.

Brug af den synkroniserede metode

Enhver metode, der er erklรฆret som synkroniseret, er kendt som en synkroniseret metode. Det bruges ogsรฅ til at lรฅse et objekt for enhver delt ressource. Sรฅ nรฅr en trรฅd pรฅberรฅber sig en synkroniseret metode. Den tager automatisk lรฅsen til det pรฅgรฆldende objekt i besiddelse og frigiver den, nรฅr den er fรฆrdig med sin opgave.

Bemรฆrk: Det synkroniserede nรธgleord kan ikke fungere med klasser og variabler. Kun metoder og blokke kan bruges med sรธgeordet.

Hvorfor bruge Synchroniseret metode?

  • Det bruges til at lรฅse et objekt for alle delte ressourcer.
  • Objektet fรฅr lรฅsen, nรฅr den synkroniserede metode kaldes.
  • Lรฅsen udlรธses ikke, fรธr trรฅden fuldfรธrer sin funktion

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 af Code:

Kรธr dette eksempel og observer, at trรฅden '0' fรฅr lรฅsen til 'mathService'-objektet fรธrst og udelukkende bruger denne lรฅs, indtil den er fuldfรธrt. Trรฅd "0" og "1" er ikke indflettet i denne kode. Udgangen er som vist nedenfor.

Output:

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

Brug af en synkroniseret blok

Lad os antage, at du ikke รธnsker at synkronisere hele metoden. I stedet vil du synkronisere et par linjer kode. Pรฅ det tidspunkt var Synchroniseret blok hjalp med at synkronisere den valgte Java kode. SyncDer er adgang til hroniserede metodelรฅse pรฅ metoden, hvorimod synkroniserede bloklรฅse tilgรฅs 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 kรธrer denne kode, vil du bemรฆrke, at den fungerer uden forstyrrelser. I den synkroniserede metode anvendes lรฅsen af โ€‹โ€‹metoden, men i den synkroniserede blok anvendes lรฅsen af โ€‹โ€‹objektet. Sรธrg for, at outputtet er som vist nedenfor.

Output:

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 af kode:

Nรฅr du kรธrer denne kode, vil du bemรฆrke, at den fungerer uden interferens, hvilket vi forventede. I den synkroniserede metode anvendes lรฅsen af โ€‹โ€‹metoden, men i den synkroniserede blokmetode anvendes lรฅsen af โ€‹โ€‹objektet.

Bruger statisk synkronisering

In Java synkronisering, hvis der er mere end et objekt, kan to trรฅde erhverve lรฅsene og gรฅ ind i en synkroniseret blok eller blok, med en separat lรฅs for hvert objekt. For at undgรฅ dette kan statisk synkronisering bruges. SyncHroniserede sรธgeord vil blive brugt fรธr statiske metoder.

Bemรฆrk: I statisk synkronisering er lรฅseadgang pรฅ klassen, ikke objektet og metoden.

Code for at demonstrere problemet med lรฅsning af flere objekter

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 af kode:

Nรฅr vi opretter en anden instans af `MathService`, introducerer vi interferens i trรฅdene, da de vil blive sammenflettet med de to objekter. Bemรฆrk, at trรฅd `0` og trรฅd `2` er sammenflettet med de to objekter, mens trรฅd `1` og `3` er sammenflettet med de to objekter.

Output:

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 hjรฆlp af synkroniseret 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();
    }
}

Kรธr ovenstรฅende kode og bemรฆrk, at vi nu har elimineret trรฅdinterferens. Udgangen af โ€‹โ€‹koden er vist nedenfor.

Output:

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

Fordele ved at bruge synkronisering

Her er fordelene ved at arbejde med samtidige applikationer:

  • Hovedformรฅlet med synkronisering i Java er at forhindre inkonsistente data ved at forhindre trรฅdinterferens.
  • Det synkroniserede sรธgeord i Java giver lรฅsning, som sikrer gensidigt udelukkende adgang til den delte ressource og forhindrer datarรฆs.
  • Det forhindrer ogsรฅ omarrangering af kodesรฆtninger af compiler, hvilket kan forรฅrsage et subtilt samtidig problem, hvis vi ikke bruger flygtige eller synkroniserede sรธgeord.
  • Synchronized sรธgeord lรฆser data fra hovedhukommelsen end cache, og nรฅr det frigiver lรฅsen.
  • Det fjerner ogsรฅ skriveoperationer fra hovedhukommelsen, hvilket eliminerer hukommelsesinkonsistensfejl.

Ulemper ved Synchroniseringsmekanisme

Synchroniseringsmekanismer har dรฅrlig ydeevne.

For eksempel

  • Antag, at der er fem processer, A1, A2, A3, A4 og A5.
  • De venter pรฅ, at de delte ressourcer fรฅr adgang til รฉn trรฅd ad gangen.
  • Alle processer lades vente, sรฅ den sidste i kรธen skal vente til alle andre processer er fรฆrdige.

Resumรฉ

  • Synchronisering refererer til evnen til at kontrollere adgangen af โ€‹โ€‹flere trรฅde til enhver delt ressource.
  • Java har to typer synkroniseringsmetoder: 1) Processynkronisering og 2) Trรฅdsynkronisering.
  • Fastlรฅse Java er bygget op omkring en intern enhed kendt som en skรฆrm eller lรฅsen.
  • Et flertrรฅdet program er en metode eller blok, der er beskyttet mod interferens fra andre trรฅde, der deler den samme ressource angivet ved hjรฆlp af nรธgleordet "synkroniseret".
  • Enhver metode, der er erklรฆret som synkroniseret, er kendt som en synkroniseret metode.
  • In Java, tilgรฅs synkroniserede metodelรฅse pรฅ metoden, hvorimod synkroniserede bloklรฅse tilgรฅs pรฅ objektet.
  • I statisk synkronisering er lรฅseadgang pรฅ klassen, ikke objektet og metoden.
  • Hovedformรฅlet med synkronisering i Java er at forhindre inkonsistente data ved at forhindre trรฅdinterferens.
  • Den stรธrste ulempe ved denne metode er, at alle processer holdes i vente, sรฅ den sidste i kรธen skal vente, indtil alle andre processer er fรฆrdige.

Opsummer dette indlรฆg med: