Java'da Senkronizasyon Kılavuzu

Yayınlanan: 2022-10-23

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.

Rekabette üstünlük sağlamak için ücretsiz teknoloji kurslarımıza göz atın.

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

Dünyanın En İyi Üniversitelerinden Online Yazılım Geliştirme Kursları öğrenin. Kariyerinizi hızlandırmak için Yönetici PG Programları, Gelişmiş Sertifika Programları veya Yüksek Lisans Programları kazanın.

İç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.

UpGrad'ın DevOps'taki Gelişmiş Sertifikasyonuna göz atın

Senkronize Blok Yazma sözdizimi

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

senkronize (lockObject )

{

// senkronize ifadeler

}

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

LJMU ve IIITB'den Bilgisayar Bilimleri Yüksek Lisansı Caltech CTME Siber Güvenlik Sertifika Programı
Tam Yığın Geliştirme Eğitim Kampı Blockchain'de PG Programı
Tam Yığın Geliştirmede Yönetici PG Programı
Tüm Kurslarımızı Aşağıdan Görüntüleyin
Yazılım Mühendisliği Kursları

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.

upGrad'ın Siber Güvenlikte Gelişmiş Sertifikasına göz atın

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.

İsteğe Bağlı Yazılım Geliştirme Becerileri

JavaScript Kursları Temel Java Kursları Veri Yapıları Kursları
Node.js Kursları SQL Kursları Tam yığın geliştirme Kursları
NFT Kursları DevOps Kursları Büyük Veri Kursları
React.js Kursları Siber Güvenlik Kursları Bulut Bilişim Kursları
Veritabanı Tasarım Kursları Python Kursları Kripto Para Kursları

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

}

}

Yazılım Geliştirme ile ilgili Popüler Makalelerimizi okuyun

Java'da Veri Soyutlama Nasıl Uygulanır? Java'da İç Sınıf nedir? Java Tanımlayıcıları: Tanım, Sözdizimi ve Örnekler
OOPS'de Kapsüllemeyi Örneklerle Anlamak C'deki Komut Satırı Argümanları Açıklaması 2022'de Bulut Bilişimin En Önemli 10 Özelliği ve Özelliği
Java'da Polimorfizm: Kavramlar, Türler, Karakteristikler ve Örnekler Java'da Paketler ve Nasıl Kullanılır? Yeni Başlayanlar İçin Git Eğitimi: Git'i Sıfırdan Öğrenin

Çı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.

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 boşluk artışı (int değeri) {

this.count += değer;

}

genel senkronize boşluk azalması (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 value) {

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'daki temel kavramları öğrenmek ister misiniz? upGrad Yönetici Yüksek Lisans Programı Yazılım Geliştirme - Tam Yığın Geliştirmede Uzmanlaşma kursu, yazılım geliştirme kariyerlerini keşfetmek isteyen yeni başlayanlar için 7 haftalık çevrimiçi bir programdır. upGrad'dan bir tamamlama sertifikası kazanmak için sektör liderleri tarafından sunulan canlı ve etkileşimli derslere, uygulama oturumlarına ve 35 saatten fazla içeriğe katılın.

7/24 öğrenci desteği ve endüstri ağının özel upGrad avantajlarından yararlanmak için bugün kaydolun !

Java'da neden senkronize kullanıyoruz?

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.

Java'da senkronizasyon nasıl uygulanır?

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.

Java'da kilitlenme nedir?

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 beklediğinde oluşur. Bu nedenle, her iki iş parçacığı birbirinin kilidi açmasını bekler ve bu da bir kilitlenmeye neden olur.