Synckronizacija u Java

ล to je Synckronizacija u Java?

In Java, sinkronizacija se odnosi na moguฤ‡nost kontrole pristupa viลกe niti bilo kojem dijeljenom resursu. To je idealna opcija kada samo jednoj niti ลพelimo dopustiti pristup dijeljenom resursu.

Ovaj pristup izvrลกenja obiฤno se naziva `asinkrono` programiranje. Na ovim procesorima takoฤ‘er postoje niti, koje su lagani procesi koji mogu izvrลกavati instrukcije istovremeno.

Vrste Synchroniziranje

Postoje dvije vrste metoda sinkronizacije Java:

1) Sinkronizacija procesa

2) Sinkronizacija niti.

Prouฤimo Thread i Sinkronizacija procesa detaljno.

Sinkronizacija procesa: Upravlja sinkronizacijom izmeฤ‘u programa. Na primjer, programi poput `Microsoft Word` i `Acrobat reader` pokreฤ‡u se kao pojedinaฤni procesi.

Sinkronizacija niti: Istodobno izvrลกavanje kritiฤnog resursa od strane dvije ili viลกe niti naziva se niti Synchroniziranje. Moลพete se dodatno grupirati u meฤ‘usobno iskljuฤivu komunikaciju i komunikaciju izmeฤ‘u niti.

ล to je Lock in Java?

Zakljuฤati u Java izgraฤ‘en je oko unutarnjeg entiteta poznatog kao monitor ili brava. Svi objekti imaju povezanu bravu. Dakle, nit koja treba konzistentan pristup poljima objekta mora steฤ‡i zakljuฤavanje objekta prije nego ลกto im pristupi, i otpuลกta zakljuฤavanje kada je posao obavljen. Ovo osigurava da samo jedna nit istovremeno pristupa dijeljenim podacima.

Viลกenitni program sa sinkronizacijom

Viลกenitni program je metoda ili blok zaลกtiฤ‡en od smetnji drugih niti koje dijele isti resurs naznaฤen pomoฤ‡u kljuฤne rijeฤi `sinkronizirano`.

Koriลกtenje sinkronizirane metode

Svaka metoda koja je deklarirana kao sinkronizirana poznata je kao sinkronizirana metoda. Takoฤ‘er se koristi za zakljuฤavanje objekta za bilo koji zajedniฤki resurs. Dakle, kada nit pozove sinkroniziranu metodu. Automatski preuzima bravu za taj objekt i otpuลกta ga kada zavrลกi svoj zadatak.

Biljeลกka: Sinkronizirana kljuฤna rijeฤ ne moลพe raditi s klasama i varijablama. Uz kljuฤnu rijeฤ mogu se koristiti samo metode i blokovi.

Zaลกto koristiti Synckronizirana metoda?

  • Koristi se za zakljuฤavanje objekta za bilo koje zajedniฤke resurse.
  • Objekt dobiva zakljuฤavanje kad god se pozove sinkronizirana metoda.
  • Brava se ne otpuลกta sve dok nit ne zavrลกi svoju funkciju

Sintaksa:

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();
    }
}

Objaลกnjenje Code:

Pokrenite ovaj primjer i promatrajte da nit `0` prvo dobiva zakljuฤavanje objekta `mathService` i koristi to zakljuฤavanje iskljuฤivo dok ne dovrลกi izvoฤ‘enje. Niti "0" i "1" nisu isprepleteni u ovom kodu. Izlaz je kao ลกto je prikazano u nastavku.

Izlaz:

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

Koriลกtenje sinkroniziranog bloka

Pretpostavimo da ne ลพelite sinkronizirati cijelu metodu. Umjesto toga, ลพelite sinkronizirati nekoliko redaka koda. U to vrijeme, Synchronizirani blok pomogao sinkronizirati taj odabrani Java kodirati. Synczakljuฤavanjima kroniziranih metoda pristupa se na metodi, dok se zakljuฤavanjima sinkroniziranih blokova pristupa na objektu.

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 Objaลกnjenje:

Nakon pokretanja ovog koda primijetit ฤ‡ete da radi bez ikakvih smetnji. U sinkroniziranoj metodi zakljuฤavanje primjenjuje metoda, ali u sinkroniziranom bloku zakljuฤavanje primjenjuje objekt. Provjerite je li izlaz kao ลกto je prikazano u nastavku.

Izlaz:

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

Objaลกnjenje koda:

Kada pokrenete ovaj kod, primijetit ฤ‡ete da radi bez smetnji, ลกto smo i oฤekivali. U sinkroniziranoj metodi zakljuฤavanje primjenjuje metoda, ali u metodi sinkroniziranog bloka zakljuฤavanje primjenjuje objekt.

Koriลกtenje statiฤke sinkronizacije

In Java sinkronizacija, ako postoji viลกe od jednog objekta, dvije niti mogu dobiti zakljuฤavanja i uฤ‡i u sinkronizirani blok ili blok, s posebnim zakljuฤavanjem za svaki objekt. Kako bi se to izbjeglo, moลพe se koristiti statiฤka sinkronizacija. Synckronizirane kljuฤne rijeฤi koristit ฤ‡e se prije statiฤkih metoda.

Biljeลกka: U statiฤkoj sinkronizaciji pristup zakljuฤavanju je na klasi, a ne na objektu i metodi.

Code demonstrirati problem zakljuฤavanja viลกe objekata

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();
    }
}

Objaลกnjenje koda:

Kada stvorimo drugu instancu `MathService`, uvodimo smetnje u niti jer ฤ‡e biti isprepletene s dva objekta. Imajte na umu da su nit `0` i nit `2` isprepletene s dva objekta, dok su nit `1` i `3` isprepletene s dva objekta.

Izlaz:

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

Isti kod koriลกtenjem sinkronizirane statiฤke 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();
    }
}

Pokrenite gornji kod i imajte na umu da smo sada eliminirali smetnje niti. Izlaz koda prikazan je u nastavku.

Izlaz:

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

Prednosti koriลกtenja sinkronizacije

Evo prednosti rada s istodobnim aplikacijama:

  • Glavni cilj sinkronizacije u Java je sprijeฤiti nedosljedne podatke sprjeฤavanjem interferencije niti.
  • Sinkronizirana kljuฤna rijeฤ u Java pruลพa zakljuฤavanje, koje osigurava meฤ‘usobno iskljuฤiv pristup dijeljenom resursu i sprjeฤava utrku podataka.
  • Takoฤ‘er sprjeฤava promjenu redoslijeda izraza koda od strane kompajler, ลกto moลพe uzrokovati suptilan istovremeni problem ako ne koristimo promjenjive ili sinkronizirane kljuฤne rijeฤi.
  • Synchronizirana kljuฤna rijeฤ ฤita podatke iz glavne memorije nego iz predmemorije i kada otkljuฤa.
  • Takoฤ‘er ispire operacije pisanja iz glavne memorije, eliminirajuฤ‡i greลกke nedosljednosti memorije.

Nedostaci Syncmehanizam kronizacije

Synckronizacija Mehanizmi imaju slabu izvedbu.

Na primjer

  • Pretpostavimo da postoji pet procesa, A1, A2, A3, A4 i A5.
  • Oni ฤekaju da zajedniฤki resursi pristupe jednoj po jednoj niti.
  • Svi procesi ostaju na ฤekanju, tako da posljednji u redu ฤekanja moraju ฤekati dok se svi ostali procesi ne zavrลกe.

Rezime

  • Synchronizacija se odnosi na moguฤ‡nost kontrole pristupa viลกe niti bilo kojem zajedniฤkom resursu.
  • Java ima dvije vrste metoda sinkronizacije: 1) Sinkronizacija procesa i 2) Sinkronizacija niti.
  • Zakljuฤati u Java izgraฤ‘en je oko unutarnjeg entiteta poznatog kao monitor ili brava.
  • Viลกenitni program je metoda ili blok zaลกtiฤ‡en od smetnji drugih niti koje dijele isti resurs oznaฤen pomoฤ‡u kljuฤne rijeฤi `sinkronizirano`.
  • Svaka metoda koja je deklarirana kao sinkronizirana poznata je kao sinkronizirana metoda.
  • In Java, zakljuฤavanjima sinkroniziranih metoda pristupa se na metodi, dok se zakljuฤavanjima sinkroniziranih blokova pristupa na objektu.
  • U statiฤkoj sinkronizaciji pristup zakljuฤavanju je na klasi, a ne na objektu i metodi.
  • Glavni cilj sinkronizacije u Java je sprijeฤiti nedosljedne podatke sprjeฤavanjem interferencije niti.
  • Najveฤ‡i nedostatak ove metode je ลกto se svi procesi drลพe na ฤekanju, tako da posljednji u redu ฤekanja moraju ฤekati dok se svi ostali procesi ne zavrลกe.

Saลพmite ovu objavu uz: