ProgramlamaBackend Geliştirici

Java'daki synchronized anahtar kelimesinin nasıl çalıştığını, ne zaman kullanılacağını ve yanlış kullanımının neden olabileceği sorunları açıklayın.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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, seçilen "monitör" için diğer iş parçacıklarına kod erişimini engeller
  • Tüm metotları veya yalnızca belirli blokları senkronize edebilirsiniz
  • Senkronizasyon — güçlü ama riskli bir araçtır (deadlock, performans)

Yanıltıcı Sorular.

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.

Tipik Hatalar ve Anti-Desenler

  • Yanlış bir nesneye senkronizasyon (örneğin, String veya bir havuzdan nesne kullanmak)
  • Çok uzun veya açık olmayan kritik bölümler, performans düşüklüğüne yol açar
  • Bekleme döngüsü veya deadlock
  • synchronized yerine java.util.concurrent paketinden modern alternatiflerin kullanılmaması

Hayattan Bir Örnek

Olumsuz Durum

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:

  • Kod kısa, daha hızlı yazılır

Eksiler:

  • Yüksek deadlock riski
  • Hata ayıklaması zor
  • Performansta büyük bir düşüş

Olumlu Durum

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:

  • Doğru davranış garantisi
  • Minimum ek yük
  • Okunması ve bakımı kolaydır

Eksiler:

  • Disiplin ve deneyim gerektirir
  • Yeni geliştiriciler için her zaman belirgin değildir