Sobes.tech
Middle+

Java'da 'synchronized' senkronizasyon mekanizması nasıl çalışır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Java'daki synchronized mekanizması, monitörler (monitor nesneleri) kavramına dayanır. Java'daki her nesneye bir monitör atanır.

Bir iş parçacığı (thread) senkronize edilmiş bir blok veya metoda giriş yaptığında, ilgili nesnenin monitörünü almaya çalışır. Monitör boşsa, iş parçacığı onu alır ve çalışmaya devam eder. Monitör başka bir iş parçacığı tarafından alınmışsa, mevcut iş parçacığı engellenir ve bekleme durumuna geçer, monitör serbest kalana kadar.

Bir iş parçacığı, senkronize edilmiş bir blok veya metoddan çıkarken (başarıyla tamamlamış veya istisna atmış olsun), monitörü serbest bırakır.

Monitör içinde şu mekanizmalar uygulanır:

  1. Karşılıklı dışlama (Mutual Exclusion): Aynı anda sadece bir iş parçacığı bir nesnenin monitörünü kullanabilir. Bu, bu nesne için senkronize kodu yalnızca bir iş parçacığının çalıştırmasını sağlar.
  2. Bekleme ve bildirim (Waiting and Notification): Monitör, wait(), notify() ve notifyAll() adlı ilişkili metodları içerir. Bu metodlar, monitörü kullanan iş parçacıklarının geçici olarak serbest bırakmasına ve bekleme durumuna geçmesine, ayrıca diğer iş parçacıkları tarafından bilgilendirilmesine olanak tanır.

Düşük seviyede uygulama şu şekildedir:

  • monitorenter komutu: Senkronize blok veya metoda girişte çalışır. Nesnenin monitörünü almaya çalışır.
  • monitorexit komutu: Senkronize blok veya metoddan çıkarken çalışır (normal bitiş veya istisna ile). Nesnenin monitörünü serbest bırakır.

Bu komutlar Java bytecode'unun bir parçasıdır ve Java sanal makinesi (JVM) tarafından işlenir. JVM, monitörleri ve iş parçacıklarının kilitlenmesini/serbest bırakılmasını yönetmek için işletim sisteminin yerel mekanizmalarını (mutexler, semaforlar) kullanır.

Monitör edinimi, nesne seviyesinde (örneğin, örnek metodlar ve bloklar için) veya sınıf seviyesinde (örneğin, statik metodlar ve bloklar için) uygulanabilir ve Class nesnesi kilit olarak kullanılır.

Kullanım örneği:

public class Counter {
    private int count = 0;

    public synchronized void increment() { // Senkronize edilmiş metod
        count++;
    }

    public void decrement() {
        synchronized (this) { // Senkronize blok
            count--;
        }
    }

    public static synchronized void staticMethod() { // Statik senkronize metod
        // ...
    }
}

Object sınıfıyla ilgili monitörlerle bağlantılı metodlar tablosu:

Metod Açıklama
wait() Monitörü kullanan iş parçacığı, monitörü geçici olarak serbest bırakır ve bekleme durumuna geçer.
notify() Bekleyen iş parçacıklarından birine haber verir, monitörü almaya çalışabilir ve devam edebilir.
notifyAll() Tüm bekleyen iş parçacıklarına haber verir.