Java’da senkronizasyon, birden fazla thread’in aynı kaynağa (örneğin bir obje veya metod) güvenli bir şekilde erişimini yönetmek için kullanılır. Çoklu thread’lerin aynı anda aynı kaynağı değiştirmeye çalışması durumunda veri tutarsızlığına ve beklenmeyen sonuçlara yol açabilir. Java’da senkronizasyon mekanizması, bu tür sorunları önlemek için kritik bölümleri korumak adına kullanılır. Bu analizde, Java’da senkronizasyonun nasıl çalıştığını, senkronizasyon yöntemlerini ve senkronizasyonun kullanımına dair örnekleri ele alacağız.
Senkronizasyonun Temelleri
Java’da senkronizasyon, synchronized
anahtar kelimesi ile sağlanır. Bu anahtar kelime, bir metodun veya bloğun aynı anda yalnızca bir thread tarafından erişilebilir olmasını sağlar. Bir thread, senkronize edilmiş bir metoda veya bloğa girdiğinde, o metoda veya bloğa ait olan kilit (lock) otomatik olarak alınır. Bu kilidi alan thread, metot veya bloktan çıkana kadar diğer thread’lerin erişimine kapalı olur.
Senkronize Metodlar
Bir metodu senkronize etmek, o metoda aynı anda yalnızca bir thread’in erişebileceği anlamına gelir. Eğer bir sınıfın birden fazla nesnesi varsa, her nesnenin kendi kilidi vardır ve bu nedenle her nesnenin senkronize metotları aynı anda farklı thread’ler tarafından erişilebilir.
public synchronized void senkronizeMetod() {
// Kritik bölge
}
Senkronize Bloklar
Bazen tüm metodu senkronize etmek yerine, yalnızca belirli bir kod bölümünü senkronize etmek daha verimli olabilir. Bu durumda senkronize bloklar kullanılır. Senkronize bloklar, belirli bir obje üzerinde kilit sağlar.
Senkronizasyonun Kullanımı ve Örnekler
Senkronizasyonun kullanılması, özellikle paylaşılan kaynaklara erişim gerektiren durumlarda önemlidir. Aşağıda, senkronizasyon kullanımına dair iki örnek verilmiştir.
Örnek 1: Banka Hesabı İşlemleri
Birden fazla thread’in aynı banka hesabı üzerinde para çekme işlemi yapmasını ele alalım. Eğer bu işlemler senkronize edilmezse, hesap bakiyesi beklenmedik şekilde değişebilir
.
public class BankaHesabi {
private int bakiye = 100;
public synchronized void paraCek(int miktar) {
if(bakiye >= miktar) {
bakiye -= miktar;
System.out.println("Para çekildi: " + miktar);
} else {
System.out.println("Yetersiz bakiye.");
}
}
}
Bir yanıt yazın