Pazar, Kasım 05, 2006

java ve synchronized kavramı

geçenlerde bir java uygulamasının yük testleri sırasında threadlerin birbiriyle yarış durumunda olmasına bağlı veritabanı hataları alınıyordu, problemi veritabanı tarafında transaction kullanarak ya da kod trafında synchronized blokları kullanarak aşmak mümkündü, (sonradan veritabanında çözmeye karar verdik, çünkü synchronized sadece tek bir kurulum için çözüm üretiyordu, aynı uygulamanın birden fazla makineye kurulması durumunda hata durumu oluşabilirdi)

bu vesileyle javanın synchronized kavramını da anlama fırsatı buldum.

synchronized bloklar "instance" bazlı şeylermiş. yani bir metodu ya da değişkeni synchronized yapmanızın pek bir anlamı olmuyor eger bu değişken ya da metodlar static değilse, herbir thread kendi instance'ini yarattığı için synchronizedlığı kendine oluyor, uygulama genelinde değil.

static değişken ve metod "instance"ları bir defa yaratıldığından ve içinde bulundukları sınıfın tüm instanceları tarafından paylaşıldıklarından uygulama genelinde tek bir synchronized blok elde etmiş oluyorsunuz.

yalnız bizim için tüm metodu static hale getirmek mümkün değildi, bu nedenle bir static değişken ekledik sınıfa "lock" adıyla, ve kodta gerekli yerleri synchronized blokları içine aldık...

private static Object lock = new Object();
...

synchronized (lock) {
...
}

şeklinde. bu şekilde lock nesnesi tüm uygulama için geçerli bir kilit olarak kullanılmış oldu.

3 yorum:

  1. private static Object = new Object();
    satırı
    private static Object lock = new Object();
    olacak sanırım.

    YanıtlaSil
  2. "yani bir metodu ya da değişkeni synchronized yapmanızın pek bir anlamı olmuyor"

    buna katılmıyorum. Bir class icin metodları synchronized yaparak instancelara (yani nesnelere) senkronize erişim sağlarsınız. Ancak programınız belirli nesnelere farklı thread'lerden erişmiyorsa buna gerek yoktur. Anladığım kadarıyla sizin icin bu durum gecerli.

    YanıtlaSil