Java'da senkronizasyon, birden fazla iş parçacığının paylaşılan kaynaklara eriştiği eşzamanlı programlamada çok önemlidir. Veri tutarsızlığını önleyerek aynı anda yalnızca bir iş parçacığının kritik bir bölüme erişmesini sağlar. Senkronizasyon, yöntemlere veya kod bloklarına uygulanabilir. Yöntem ve Blok Senkronizasyonu
Shilpa Shetty'nin yaşı
Senkronizasyon Türleri
- Yöntem Senkronizasyonu: Aynı anda yalnızca bir iş parçacığının yürütmesini sağlamak için yöntemin tamamını kilitler.
- Senkronizasyonu Blokla: Bir yöntem içindeki kodun yalnızca kritik bölümünü kilitler.
Birden fazla iş parçacığı tarafından erişilen değiştirilebilir nesneler için senkronizasyon gereklidir. Değiştirilemez nesneler veya salt okunur erişim, senkronizasyon gerektirmez.
Yöntem Senkronizasyonu
Bir yöntemi senkronize etmek için senkronize edilmiş anahtar kelimeyi ekleyin. Bu, aynı anda yalnızca bir iş parçacığının yöntemi yürütebilmesini sağlar.
Örnek 1: Senkronize Olmayan Yöntem
Javaclass Line { public void getLine() { for (int i = 0; i < 3; i++) { System.out.println(i); try { Thread.sleep(100); } catch (Exception e) { System.out.println(e); } } } } class Train extends Thread { Line line; Train(Line line) { this.line = line; } public void run() { line.getLine(); } } public class Geeks { public static void main(String[] args) { Line obj = new Line(); Train t1 = new Train(obj); Train t2 = new Train(obj); t1.start(); t2.start(); } }
Çıkış
0 0 1 1 2 2
Açıklama: t1 ve t2 iş parçacıkları aynı anda yönteme erişerek karışık çıktıya neden olur.
Örnek 2: Senkronize Yöntem
Javaclass Line { synchronized public void getLine() { for (int i = 0; i < 3; i++) { System.out.println(i); try { Thread.sleep(100); } catch (Exception e) { System.out.println(e); } } } } class Train extends Thread { Line line; Train(Line line) { this.line = line; } public void run() { line.getLine(); } } public class Geeks { public static void main(String[] args) { Line obj = new Line(); Train t1 = new Train(obj); Train t2 = new Train(obj); t1.start(); t2.start(); } }
Çıkış
0 1 2 0 1 2
Açıklama: Veri tutarlılığını sağlamak için yöntemi aynı anda yalnızca bir iş parçacığı yürütür.
Senkronizasyonu Blokla
Blok senkronizasyonu, bir yöntemin yalnızca bir kısmı kritik kod içerdiğinde kullanılır. Bu, iş parçacıklarının kritik olmayan kodları aynı anda yürütmesine izin vererek performansı artırır.
Java dizesi.format
Örnek: Senkronize Blok
Javaimport java.util.*; class Geek { String name = ''; public int count = 0; public void geekName(String geek List<String> list) { synchronized(this) { name = geek; count++; } list.add(geek); } } public class GFG { public static void main(String[] args) { Geek gk = new Geek(); List<String> list = new ArrayList<>(); gk.geekName('Mohit' list); System.out.println(gk.name); } }
Çıkış
Mohit
Açıklama: Yalnızca blok güncelleme adı ve sayısı senkronize edilir. Listeye ad ekleme işlemi eş zamanlı olarak yürütülür.
Yöntem ve Blok Senkronizasyonu
| Özellik | Yöntem Senkronizasyonu | Senkronizasyonu Blokla |
|---|---|---|
| Kapsam | Tüm yöntemi kilitler | Yalnızca belirli kod bloğunu kilitler |
| Performans | Kritik olmayan kod için gereksiz engellemeye neden olabilir | Daha verimli, yalnızca kritik bölümler senkronize edilir |
| Kilit | Yöntemin nesnesindeki kilidi alır | Blokta belirtilen nesne veya sınıf üzerindeki kilidi alır |
| Esneklik | Daha az esnek olan tüm yöntem kilitlendi | Daha esnek, seçici senkronizasyona olanak tanır |
Önemli Noktalar
- Senkronize bir yönteme/bloğa giren bir iş parçacığı, bir kilit alır ve çıkışta onu serbest bırakır.
- Örnek yöntemleri/bloklar: Nesne düzeyinde kilit edinin.
- Statik yöntemler/bloklar: Sınıf düzeyinde kilit edinin.
- Boş nesnelerdeki senkronizasyon NullPointerException'ı oluşturur.
- wait() notify() ve notifyAll() senkronizasyondaki anahtar yöntemlerdir.
- İş parçacıklarının farklı nesneleri kilitlemesini önlemek için son olmayan alanları senkronize etmekten kaçının.
- senkronize anahtar kelime değişkenlere uygulanamaz.
Avantajları
- Çok iş parçacıklı programlarda paylaşılan kaynakların karşılıklı hariç tutulmasını sağlar.
- Hem senkronize örnek hem de statik yöntemler, farklı nesneleri kilitledikleri için aynı anda çalışabilir.
Sınırlamalar
- Eşzamanlılığı sınırlayan eşzamanlı okumaları önler.
- Senkronize yöntemler performansı düşürebilir. Yalnızca kritik bölümler için blok senkronizasyonunu tercih edin.