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.
