Java'da Kapsamlı Senkronizasyon Kılavuzu

Yayınlanan: 2022-05-20

Java'da senkronizasyonu açıklamadan önce , multithreading kavramını kısaca tekrar gözden geçirmeliyiz. Java'nın çoklu iş parçacığı özelliği, maksimum CPU kullanımı için bir programın iki veya daha fazla bölümünün aynı anda yürütülmesine izin verir. Böyle bir programın her parçası bir iş parçacığıdır ve iş parçacıkları bir süreç içindeki hafif süreçlerdir.

Şimdi, bir programın birden çok iş parçacığı aynı kaynaklara erişmeye ve yanlış sonuçlar üretmeye çalışabilir. Bu nedenle, belirli bir zamanda yalnızca bir iş parçacığının kaynaklara erişimi olduğundan emin olmak için bir miktar senkronizasyon olmalıdır.

Java'da senkronizasyonun ne olduğuyla ilgili bu kılavuz , senkronizasyon kavramını örneklerle ayrıntılı olarak inceleyecektir.

İçindekiler

Java'da senkronizasyon nedir?

Java senkronizasyonu, birden çok iş parçacığının paylaşılan bir kaynağa erişimini kontrol etme yeteneğidir. Çok iş parçacıklı Java programları aynı kaynağa erişmeye çalıştığında ve hatalı sonuçlar ürettiğinde yararlıdır. Java senkronizasyon özelliğini kullanarak, belirli bir zaman noktasında kaynağa yalnızca tek bir iş parçacığı ulaşabilir.

Java, aynı nesne üzerinde senkronize olan ve aynı anda içlerinde yalnızca bir iş parçacığı yürütülebilen senkronize blokları kullanarak iş parçacıklarının görevini senkronize etmenin bir yolunu sağlar. Bu bloklar, synchronized anahtar sözcüğü ile işaretlenir ve blok içinde zaten bulunan iş parçacığı yürütmesini bitirip bloktan ayrılana kadar, senkronize bloğa girmeye çalışan diğer herhangi bir iş parçacığını engeller.

Senkronize Blok Yazma sözdizimi

Java'da senkronize bir blok yazmak için genel sözdizimi aşağıdaki gibidir:

senkronize (lockObject )

{

// senkronize ifadeler

}

Yukarıdaki sözdiziminde, lockObject , kilidi senkronize edilmiş öğelerle ilişkili olan bir nesneyi ifade eder. Şimdi, bu bizi Java'daki kilit kavramına getiriyor.

Java'daki kilitler

Java'da senkronizasyon, kilit veya monitör etrafında oluşturulmuştur. Her nesnenin ilişkili bir kilidi vardır. İdeal olarak, bir nesnenin alanlarına erişim gerektiren bir iş parçacığının önce nesnenin kilidini alması gerekir. Kilit, senkronizasyon bloğundan daha karmaşık ve esnek bir iş parçacığı senkronizasyon mekanizmasıdır. Kapsamlı kilit uygulamaları içeren java.util.concurrent.lock paketi içinde tanımlanmıştır.

Dünyanın en iyi Üniversitelerinden Çevrimiçi yazılım geliştirme kurslarını öğrenin. Kariyerinizi hızlandırmak için Yönetici PG Programları, Gelişmiş Sertifika Programları veya Yüksek Lisans Programları kazanın.

Java Senkronize Yöntemi

Java senkronize yönteminin amacı, paylaşılan kaynaklar için nesneleri kilitlemektir. Böylece, evreler senkronize bir yöntemi çağırdığında, yöntem otomatik olarak o nesne için kilidi alır ve iş parçacığı işini yürüttüğünde onu serbest bırakır.

İşte bir Java senkronize yöntemi örneği:

//java eşitlenmiş yöntem örneği

sınıf Tablosu{

senkronize void printTable(int n){//senkronize yöntem

for(int i=1;i<=5;i++){

System.out.println(n*i);

denemek{

Thread.sleep(400);

}catch(Exception e){System.out.println(e);}

}

}

}

class MyThread1 Thread'i genişletir{

Tablo t;

MyThread1(Tablo t){

this.t=t;

}

public void run(){

t.printTable(5);

}

}

class MyThread2, Thread'i genişletir{

Tablo t;

MyThread2(Tablo t){

this.t=t;

}

public void run(){

t.printTable(100);

}

}

genel sınıf TestSynchronization2{

public static void main(String args[]){

Tablo nesnesi = new Table();//yalnızca bir nesne

MyThread1 t1=yeni MyThread1(obj);

MyThread2 t2=yeni MyThread2(obj);

t1.start();

t2.start();

}

}

Çıktı:

5

10

15

20

25

100

200

300

400

500

Senkronizasyon olmadan ne olur?

Şimdi, senkronizasyon olmadan önceki programa bakalım (synchroized anahtar kelimesinin yokluğuna dikkat edin).

sınıf Tablosu{

void printTable(int n){//yöntem senkronize değil

for(int i=1;i<=5;i++){

System.out.println(n*i);

denemek{

Thread.sleep(400);

}catch(Exception e){System.out.println(e);}

}

}

}

class MyThread1 Thread'i genişletir{

Tablo t;

MyThread1(Tablo t){

this.t=t;

}

public void run(){

t.printTable(5);

}

}

class MyThread2, Thread'i genişletir{

Tablo t;

MyThread2(Tablo t){

this.t=t;

}

public void run(){

t.printTable(100);

}

}

sınıf TestSenkronizasyonu1{

public static void main(String args[]){

Tablo nesnesi = new Table();//yalnızca bir nesne

MyThread1 t1=yeni MyThread1(obj);

MyThread2 t2=yeni MyThread2(obj);

t1.start();

t2.start();

}

}

Çıktı:

5

100

10

200

15

300

20

400

25

500

Gördüğünüz gibi, çıktı senkronizasyon olmadan tutarsız.

Popüler Yazılım Mühendisliği Kurslarımızı keşfedin

SL. Numara Yazılım Geliştirme Programları
1 LJMU ve IIITB'den Bilgisayar Bilimleri Yüksek Lisansı Caltech CTME Siber Güvenlik Sertifika Programı
2 Tam Yığın Geliştirme Eğitim Kampı Blockchain'de PG Programı
3 Yazılım Geliştirmede Yönetici Yüksek Lisans Programı - DevOps'ta Uzmanlık Tüm Yazılım Mühendisliği Kurslarını Görüntüle

Java'da Senkronizasyon Türleri

Java'da iş parçacığı senkronizasyonunun ne olduğunu cevaplamak için iki tür senkronizasyonumuz var: iş parçacığı senkronizasyonu ve işlem senkronizasyonu.

Her birinin ne anlama geldiğini anlayalım.

İş parçacığı senkronizasyonu: Birden çok iş parçacığı paylaşılan bir kaynağa erişmeye çalıştığında, kaynağın aynı anda yalnızca bir iş parçacığı tarafından kullanıldığından emin olmalıyız. İş parçacığı senkronizasyonu, birden çok iş parçacığı aynı anda kaynağı kullanmaya çalışırken, yalnızca bir iş parçacığının paylaşılan kaynağı kullanmasına izin verme işlemidir.

İşlem senkronizasyonu: İşlemlerin uygun bir yürütme sırasına bağlı olduğu bir duruma ulaşmak için birden fazla işlemin aynı anda yürütülmesini ifade eder. İki veya daha fazla işlem işbirliği yaptığında ve bir işlemin yürütülmesi diğerini etkilediğinde işlem senkronizasyonu gerekir. Böylece süreç senkronizasyonu, hatalı çıktı olasılığını ortadan kaldırır ve uygun yürütme sırasını garanti eder.

Java'da Senkronizasyon Yöntemleri

Genel olarak, Java'da dört eşitleme yöntemi vardır:

  • Senkronize statik yöntemler
  • Senkronize örnek yöntemleri
  • Statik yöntemler içinde senkronize blok
  • Örnek yöntemleri içinde senkronize blok

Java senkronizasyonunun her yöntemine daha ayrıntılı olarak bakalım.

Senkronize statik yöntemler

Burada, Java'daki statik yöntemleri işaretlemek için synchronized anahtar sözcüğünü kullanıyoruz. İşte bir Java senkronize statik yöntem örneği:

genel statik MyStaticCounter {

özel statik int sayı = 0;

genel statik senkronize boşluk artışı (int değeri) {

say += değer;

}

}

Senkronize örnek yöntemleri

Örnek yöntemlerle senkronize bir blok kullanırken, her nesnenin senkronize yöntemi vardır. Her nesne, bir yöntem içinde yürütülebilen yalnızca bir iş parçacığına sahip olabilir. Birden fazla nesne varsa, blok içindeki her nesne için tek bir iş parçacığı yürütülebilir.

genel sınıf MyCounter {

özel int sayısı = 0;

genel senkronize geçersiz artış (int değeri) {

this.count += değer;

}

genel senkronize geçersiz azalma (int değeri) {

this.count -= değer;

}

}

Statik yöntemler içinde senkronize blok

Aşağıda, statik bir yöntem içinde senkronize bir blok kullandığımız bir örnek verilmiştir:

genel sınıf MyClass {

public static void print(String mesajı) {

senkronize(MyClass.class) {

log.writeln(mesaj);

}

}

}

Örnek yöntemleri içinde senkronize blok

Metodun tamamını senkronize etmek yerine, metod içinde belirli bir blokta senkronize kullanabiliriz. Aşağıda, senkronize edilmemiş bir yöntem içindeki senkronize edilmiş bir kod bloğu örneği verilmiştir:

public void increment(int değeri) {

senkronize(bu) {

this.count += değer;

}

}

Java'da Senkronizasyon İhtiyacı

Artık Java'da senkronizasyonun ne olduğunu bildiğinize göre , bunu neden kullandığımızı merak ediyor olabilirsiniz.

Java senkronize anahtar sözcüğü, eşzamanlı programlama için gerekli olan işlevleri sağlar. Java'da senkronizasyon şu şekilde yardımcı olur:

  • Java senkronizasyonu, iş parçacıkları arasındaki herhangi bir yarış koşulunu ortadan kaldırmak ve paylaşılan kaynağa karşılıklı olarak özel erişim sağlamak için kilitleme özelliği sağlar.
  • Java senkronize kilitleme, hem kilitleme hem de kilit açma özelliklerini sağlar. Bu nedenle, bir iş parçacığının senkronize bir yöntem veya bloğa girmeden önce kilidi alması gerekir.
  • synchronized anahtar sözcüğü, program ifadelerinin derleyici tarafından yeniden sıralanmasını engeller.

Çözüm

Özetle, Java'daki senkronizasyon, bir seferde yalnızca bir iş parçacığının paylaşılan kaynağa erişebilmesini sağlar. Java synchronized anahtar sözcüğünü kullanarak bir blok veya yöntemi senkronize edebiliriz. Bir iş parçacığı senkronize bir bloğun içine girmek istediğinde, bir kilit edinmelidir ve bloktan ayrıldıktan sonra iş parçacığı kilidi serbest bırakır. synchronized anahtar sözcüğünü yöntemlerle veya bir yöntem bloğunun içinde kullanabiliriz.

Java'yı nerede öğreneceğinizi mi merak ediyorsunuz?

upGrad'ın Yazılım Mühendisliğinde İş Bağlantılı PG Sertifikasyonu aradığın şey bu!

Yeni mezunlar ve son yıllar için özel olarak tasarlanan upGrad'ın Yazılım Mühendisliğinde İş Bağlantılı PG Sertifikası, programlamayı öğrenmek ve giriş seviyesi yazılım rollerine yerleşmek isteyenler için mükemmeldir. Bu 5 aylık çevrimiçi program Java, JavaScript, HTML5, DSA, AWS, MERN ve daha fazlası gibi en iyi yazılım becerilerini öğretecek!

S: Java'da neden senkronize kullanıyoruz?

C: Java'daki synchronized anahtar sözcüğü, aynı anda yalnızca bir iş parçacığının paylaşılan kaynaklara erişmesini sağlar. Çok iş parçacıklı Java programları aynı kaynağa erişmeye çalıştığında ve hatalı sonuçlar ürettiğinde kullanışlıdır.

S: Java'da senkronizasyon nasıl uygulanır?

C: Java, belirli bir zamanda bir monitöre sahip olan yalnızca bir iş parçacığı ile monitör kavramını kullanarak senkronizasyon uygular. Bir iş parçacığı bir kilit aldığında, monitöre erişir ve kilitli monitöre girmeye çalışan diğer tüm iş parçacıkları, ilk iş parçacığı monitörden ayrılana kadar bloke kalır.

S: Java'da kilitlenme nedir?

C: Java kilitlenmesi, bir iş parçacığı bir nesne kilidini beklerken, ancak başka bir iş parçacığı onu aldığında ve ikinci iş parçacığı, birincisi tarafından edinilen bir nesne kilidini beklerken oluşur. Bu nedenle, her iki iş parçacığı birbirinin kilidi açmasını bekler ve bu da bir kilitlenmeye neden olur.