Synckronizasyon Java

Nedir? Synckronizasyon Java?

In Java, senkronizasyon, birden fazla iลŸ parรงacฤฑฤŸฤฑnฤฑn herhangi bir paylaลŸฤฑlan kaynaฤŸa eriลŸimini kontrol etme yeteneฤŸini ifade eder. PaylaลŸฤฑlan kaynaฤŸa yalnฤฑzca bir iลŸ parรงacฤฑฤŸฤฑnฤฑn eriลŸmesine izin vermek istediฤŸimizde ideal bir seรงenektir.

Bu yรผrรผtme yaklaลŸฤฑmฤฑna genellikle `asenkron` programlama denir. Bu iลŸlemcilerde ayrฤฑca talimatlarฤฑ eลŸ zamanlฤฑ olarak yรผrรผtebilen hafif sรผreรงler olan iลŸ parรงacฤฑklarฤฑ da bulunur.

Tipleri Synckronizasyon

ฤฐki tรผr senkronizasyon yรถntemi vardฤฑr Java:

1) ฤฐลŸlem senkronizasyonu

2) ฤฐลŸ parรงacฤฑฤŸฤฑ senkronizasyonu.

Konuyu inceleyelim ve ฤฐลŸlem senkronizasyonu detayda.

ฤฐลŸlem senkronizasyonu: Programlar arasฤฑndaki senkronizasyonu yรถnetir. ร–rneฤŸin, ` gibi programlarMicrosoft Word` ve `Acrobat Reader` ayrฤฑ iลŸlemler olarak รงalฤฑลŸฤฑr.

ฤฐลŸ parรงacฤฑฤŸฤฑ senkronizasyonu: Kritik kaynaฤŸฤฑn iki veya daha fazla ฤฐลŸ ParรงacฤฑฤŸฤฑ tarafฤฑndan eลŸzamanlฤฑ yรผrรผtรผlmesine ฤฐลŸ ParรงacฤฑฤŸฤฑ adฤฑ verilir Synckronizasyon. Birbirini dฤฑลŸlayan ve iลŸ parรงacฤฑฤŸฤฑ arasฤฑ iletiลŸim iรงin daha fazla gruplandฤฑrฤฑlabilirsiniz.

Kilitlenmek Nedir? Java?

ฤฐรงeri kilitlemek Java monitรถr veya kilit olarak bilinen dahili bir varlฤฑฤŸฤฑn etrafฤฑnda inลŸa edilmiลŸtir. Tรผm nesnelerin kendileriyle iliลŸkili bir kilidi vardฤฑr. Bu nedenle, bir nesnenin alanlarฤฑna tutarlฤฑ eriลŸime ihtiyaรง duyan iลŸ parรงacฤฑฤŸฤฑnฤฑn, bunlara eriลŸmeden รถnce nesnenin kilidini almasฤฑ gerekir ve iลŸ bittiฤŸinde kilidi serbest bฤฑrakฤฑr. Bu, aynฤฑ anda yalnฤฑzca bir iลŸ parรงacฤฑฤŸฤฑnฤฑn paylaลŸฤฑlan verilere eriลŸmesini saฤŸlar.

Senkronizasyonlu รงok iลŸ parรงacฤฑklฤฑ program

ร‡ok iลŸ parรงacฤฑklฤฑ bir program `syncronized` anahtar sรถzcรผฤŸรผ kullanฤฑlarak belirtilen aynฤฑ kaynaฤŸฤฑ paylaลŸan diฤŸer iลŸ parรงacฤฑklarฤฑnฤฑn mรผdahalesinden korunan bir yรถntem veya bloktur.

EลŸzamanlฤฑ yรถntemi kullanma

EลŸzamanlฤฑ olarak bildirilen herhangi bir yรถnteme eลŸzamanlanmฤฑลŸ Yรถntem denir. Ayrฤฑca, herhangi bir paylaลŸฤฑlan kaynak iรงin bir nesneyi kilitlemek iรงin kullanฤฑlฤฑr. Yani, bir iลŸ parรงacฤฑฤŸฤฑ eลŸzamanlanmฤฑลŸ bir yรถntemi รงaฤŸฤฑrdฤฑฤŸฤฑnda. Otomatik olarak o nesnenin kilidini ele geรงirir ve gรถrevini tamamladฤฑฤŸฤฑnda serbest bฤฑrakฤฑr.

Not: synchronized anahtar sรถzcรผฤŸรผ sฤฑnฤฑflar ve deฤŸiลŸkenlerle รงalฤฑลŸamaz. Anahtar sรถzcรผkle yalnฤฑzca yรถntemler ve bloklar kullanฤฑlabilir.

neden kullan SynckronikleลŸtirilmiลŸ Yรถntem?

  • Herhangi bir paylaลŸฤฑlan kaynak iรงin bir nesneyi kilitlemek iรงin kullanฤฑlฤฑr.
  • EลŸzamanlฤฑ yรถntem รงaฤŸrฤฑldฤฑฤŸฤฑnda nesne kilidi alฤฑr.
  • ฤฐplik iลŸlevini tamamlayana kadar kilit aรงฤฑlmaz

Sรถzdizimi:

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

Aรงฤฑklamasฤฑ Code:

Bu รถrneฤŸi รงalฤฑลŸtฤฑrฤฑn ve ilk รถnce "0" iลŸ parรงacฤฑฤŸฤฑnฤฑn "mathService" nesnesinin kilidini aldฤฑฤŸฤฑnฤฑ ve yรผrรผtmeyi tamamlayana kadar bu kilidi รถzel olarak kullandฤฑฤŸฤฑnฤฑ gรถzlemleyin. ฤฐลŸ parรงacฤฑฤŸฤฑ '0' ve '1' bu kodda araya eklenmez. ร‡ฤฑktฤฑ aลŸaฤŸฤฑda gรถsterildiฤŸi gibidir.

ร‡ฤฑktฤฑ:

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

EลŸzamanlฤฑ bir blok kullanma

Tรผm yรถntemi senkronize etmek istemediฤŸinizi varsayalฤฑm. Bunun yerine birkaรง satฤฑr kodu senkronize etmek istiyorsunuz. O zaman, Synchronized blok, seรงilenlerin senkronize edilmesine yardฤฑmcฤฑ oldu Java kodu. SyncEลŸzamanlฤฑ yรถntem kilitlerine yรถntem รผzerinde eriลŸilirken, eลŸzamanlanmฤฑลŸ blok kilitlerine nesne รผzerinde eriลŸilir.

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 Aรงฤฑklama:

Bu kodu รงalฤฑลŸtฤฑrdฤฑฤŸฤฑnฤฑzda, herhangi bir mรผdahale olmadan รงalฤฑลŸtฤฑฤŸฤฑnฤฑ gรถreceksiniz. EลŸzamanlฤฑ yรถntemde, kilit yรถntem tarafฤฑndan uygulanฤฑr, ancak eลŸzamanlanmฤฑลŸ blokta, kilit nesne tarafฤฑndan uygulanฤฑr. ร‡ฤฑktฤฑnฤฑn aลŸaฤŸฤฑda gรถsterildiฤŸi gibi olduฤŸundan emin olun.

ร‡ฤฑktฤฑ:

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

Kodun aรงฤฑklamasฤฑ:

Bu kodu รงalฤฑลŸtฤฑrdฤฑฤŸฤฑnฤฑzda, beklediฤŸimiz gibi, herhangi bir mรผdahale olmadan รงalฤฑลŸtฤฑฤŸฤฑnฤฑ gรถreceksiniz. EลŸzamanlฤฑ yรถntemde, kilit yรถntem tarafฤฑndan uygulanฤฑr, ancak eลŸzamanlanmฤฑลŸ blok yรถnteminde, kilit nesne tarafฤฑndan uygulanฤฑr.

Statik senkronizasyonu kullanma

In Java senkronizasyon, birden fazla nesne varsa, iki iลŸ parรงacฤฑฤŸฤฑ kilitleri edinebilir ve her nesne iรงin ayrฤฑ bir kilitle senkronize bir blok veya bloฤŸa girebilir. Bunu รถnlemek iรงin statik senkronizasyon kullanฤฑlabilir. SyncStatik yรถntemlerden รถnce hronized anahtar kelimeler kullanฤฑlacaktฤฑr.

Not: Statik senkronizasyonda kilit eriลŸimi nesne ve metot รผzerinde deฤŸil, sฤฑnฤฑf รผzerindedir.

Code birden fazla nesnenin kilitlenmesi sorununu gรถstermek iรงin

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

Kodun aรงฤฑklamasฤฑ:

'MathService'in baลŸka bir รถrneฤŸini oluลŸturduฤŸumuzda, iki nesneyle serpiลŸtirilecekleri iรงin iลŸ parรงacฤฑklarฤฑnda giriลŸime neden oluyoruz. '0' ve '2' iลŸ parรงacฤฑฤŸฤฑnฤฑn iki nesneyle serpiลŸtirildiฤŸini, '1' ve '3' iลŸ parรงacฤฑฤŸฤฑnฤฑn ise iki nesneyle serpiลŸtirildiฤŸini unutmayฤฑn.

ร‡ฤฑktฤฑ:

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

Aynฤฑ kod, senkronize statik yรถntemi kullanฤฑyor

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

Yukarฤฑdaki kodu รงalฤฑลŸtฤฑrฤฑn ve artฤฑk iลŸ parรงacฤฑฤŸฤฑ giriลŸimini ortadan kaldฤฑrdฤฑฤŸฤฑmฤฑzฤฑ unutmayฤฑn. Kodun รงฤฑktฤฑsฤฑ aลŸaฤŸฤฑda gรถsterilmiลŸtir.

ร‡ฤฑktฤฑ:

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

Senkronizasyonun kullanฤฑlmasฤฑnฤฑn avantajlarฤฑ

EลŸzamanlฤฑ uygulamalarla รงalฤฑลŸmanฤฑn avantajlarฤฑ ลŸunlardฤฑr:

  • Senkronizasyonun temel amacฤฑ Java iลŸ parรงacฤฑฤŸฤฑnฤฑn karฤฑลŸmasฤฑnฤฑ รถnleyerek tutarsฤฑz verilerin oluลŸmasฤฑnฤฑ engellemektir.
  • EลŸzamanlฤฑ anahtar kelime Java PaylaลŸฤฑlan kaynaฤŸa karลŸฤฑlฤฑklฤฑ olarak รถzel eriลŸimi garanti altฤฑna alan ve veri yarฤฑลŸฤฑnฤฑ engelleyen kilitleme รถzelliฤŸi sunar.
  • Ayrฤฑca kod ifadelerinin kod ifadelerinin yeniden sฤฑralanmasฤฑnฤฑ da รถnler. derleyiciBu, uรงucu veya senkronize anahtar sรถzcรผkleri kullanmazsak, eลŸzamanlฤฑ bir soruna neden olabilir.
  • Synchronized anahtar kelime, ana bellekteki verileri รถnbellekten okur ve kilidi serbest bฤฑraktฤฑฤŸฤฑnda.
  • Ayrฤฑca yazma iลŸlemlerini ana bellekten temizleyerek bellek tutarsฤฑzlฤฑฤŸฤฑ hatalarฤฑnฤฑ ortadan kaldฤฑrฤฑr.

Dezavantajlarฤฑ SyncHronizasyon Mekanizmasฤฑ

Synchronizasyon Mekanizmalarฤฑ dรผลŸรผk performansa sahiptir.

ร–rneฤŸin

  • A1, A2, A3, A4 ve A5 olmak รผzere beลŸ sรผreรง olduฤŸunu varsayalฤฑm.
  • PaylaลŸฤฑlan kaynaklarฤฑn aynฤฑ anda bir iลŸ parรงacฤฑฤŸฤฑna eriลŸmesini bekliyorlar.
  • Tรผm iลŸlemler beklemede tutulur, bu nedenle kuyruktaki son iลŸlemin diฤŸer tรผm iลŸlemler tamamlanana kadar beklemesi gerekir.

ร–ZET

  • Synchronizasyon, birden fazla iลŸ parรงacฤฑฤŸฤฑnฤฑn herhangi bir paylaลŸฤฑlan kaynaฤŸa eriลŸimini kontrol etme yeteneฤŸini ifade eder.
  • Java iki tรผr senkronizasyon yรถntemi vardฤฑr: 1) ฤฐลŸlem senkronizasyonu ve 2) ฤฐลŸ parรงacฤฑฤŸฤฑ senkronizasyonu.
  • ฤฐรงeri kilitlemek Java monitรถr veya kilit olarak bilinen dahili bir varlฤฑฤŸฤฑn etrafฤฑnda inลŸa edilmiลŸtir.
  • ร‡ok iลŸ parรงacฤฑklฤฑ program, `syncronized` anahtar sรถzcรผฤŸรผ kullanฤฑlarak belirtilen aynฤฑ kaynaฤŸฤฑ paylaลŸan diฤŸer iลŸ parรงacฤฑklarฤฑndan gelen mรผdahaleden korunan bir yรถntem veya bloktur.
  • EลŸzamanlฤฑ olarak tanฤฑmlanan herhangi bir yรถnteme eลŸzamanlฤฑ yรถntem denir.
  • In JavaEลŸzamanlฤฑ yรถntem kilitlerine yรถntem รผzerinde eriลŸilirken, eลŸzamanlฤฑ blok kilitlerine nesne รผzerinde eriลŸilir.
  • Statik senkronizasyonda kilit eriลŸimi nesne ve metot รผzerinde deฤŸil, sฤฑnฤฑf รผzerindedir.
  • Senkronizasyonun temel amacฤฑ Java iลŸ parรงacฤฑฤŸฤฑnฤฑn karฤฑลŸmasฤฑnฤฑ รถnleyerek tutarsฤฑz verilerin oluลŸmasฤฑnฤฑ engellemektir.
  • Bu yรถntemin en bรผyรผk dezavantajฤฑ tรผm sรผreรงlerin beklemede tutulmasฤฑ, dolayฤฑsฤฑyla kuyruktaki sonuncunun diฤŸer tรผm sรผreรงler tamamlanana kadar beklemesi gerektiฤŸidir.

Bu yazฤฑyฤฑ ลŸu ลŸekilde รถzetleyin: