synchronized anahtar kelimesi, Java'nın çok iş parçacığı desteği geldiğinden beri, farklı iş parçacıkları arasında kod bloklarına veya metodlara tekil erişimi garanti etmek için mevcuttur. Tarihsel olarak, bu, farklı iş parçacıklarının paylaşılan verilere aynı anda erişimi sırasında ortaya çıkan klasik race condition ve veri tutarsızlığı sorunlarının Java tarafından bir yanıtıdır.
Problem, çok iş parçacıklı çalışmalarda, işlemlerin "atomikliğini" sağlamak ve nesnelerin durumlarının çelişkili değişikliklerini önlemektir. Synchronized ile yanlış çalışma, deadlock, performansın düşmesi veya yanlış bir izleyici nesnesi seçeneksizliği durumunda senkronizasyon eksikliğine yol açabilir.
Çözüm — yalnızca bir iş parçacığının bu bölümü aynı anda çalıştırdığını garanti etmek için gereken metod veya kod bloğu için synchronized anahtar kelimesini kullanmaktır. Eşzamanlayıcı nesnenin dikkatli bir şekilde seçilmesi, uzun kritik bölümlerin önlenmesi, daha karmaşık görevler için java.util.concurrent paketinden özel sınıfların kullanılması gereklidir.
Kod örneği:
public class Counter { private int count = 0; public synchronized void increment() { count++; } public int getCount() { return count; } } // Ayrı bir nesne üzerinde yalnızca kodun bir kısmının senkronizasyonu: private final Object lock = new Object(); public void complexIncrement() { synchronized (lock) { // kritik bölüm count++; } } }
Anahtar özellikler:
Synchronized metodu ile synchronized blok arasındaki fark nedir?
Senkronize edilmiş metod, nesnenin (veya static ise sınıfın) "monitörünü" engeller, senkronize edilmiş blok ise belirli bir monitör nesnesini açık bir şekilde belirtmeyi sağlar, bu da daha büyük bir esneklik sağlar.
Eğer bir nesnede farklı metotları synchronized olarak belirlersek ne olur?
Eğer her iki metod da synchronized olarak işaretlenmişse (static değilse), her ikisi de monitör olarak kendisini (this) kullanır. Bir iş parçacığı, diğeri bu metodlardan birindeyken hiçbirine giremez.
Static metotları ve normal metotları senkronize edebilir miyiz? Birbirleriyle nasıl serbest bırakılırlar?
Static metotlar, sınıfın kendisinin monitörünü (Class nesnesi) kullanırken, normal metotlar ise örnek nesnesinin monitörünü kullanır. Dolayısıyla, bir static synchronized metodu ve bir normal synchronized metodu birbirini engellemez.
Bir geliştirici, farklı nesnelerin metotlarını senkronize ederken, her zaman aynı String'i monitör olarak kullanıyor. Sonuç olarak, havuzdan tekrar kullanılan stringler nedeniyle yavaşlama ve "rastgele" deadlocklar oluşuyor.
Artılar:
Eksiler:
Yalnızca sınıf içinde oluşturulan özel final nesneye (private final Object lock) dayalı senkronizasyon, Kritik bölümlerinin süreleri minimumdur.
Artılar:
Eksiler: