Java’da Multithreading – Bölüm 2: Threadlerin Senkronizasyonuna Giriş

Aynı veri ile ilgilenen birden fazla threadin veriye erişiminin düzenlenmesine threadlerin senkronizasyonu denir. Threadlerin senkronizasyonu sırasında karşılaştığımız zorlukların ilki bazı durumlarda verinin performans gerekçesiyle otomatik olarak önbelleklenmesidir (caching). Bir örnek ile üstesinden gelmemiz gereken bu durumu açıklayalım. Thread sınıfını genişleterek oluşturduğumuz Processor sınıfımız aşağıdaki gibi olsun:

class Processor extends Thread {

    private boolean running = true;

    @Override
    public void run() {
        while (running) {
            System.out.println("Merhaba");
        }
    }

}

“run()” metodunun içeriğini incelersek bu sınıftan bir örnek oluşturup “start()” metodunu çağırdığımızda başlatılacak olan threadin sonsuza kadar “Merhaba” yazdıracağını görebiliriz. Çünkü “running” değişkeni her zaman “true” değerindedir. Gelin yeni bir metot ekleyelim ve çağrıldığında  “running” değişkeninin değerini “false” yaparak “while” döngüsünü sonlandırmış olalım, dolayısıyla thread de sonlanmış olsun:

class Processor extends Thread {

    ...

    public void shutdown() {
        this.running = false;
    }

}

“main” metodumuz ise Processor tipinde bir threadi başlatsın ve bu thread başladıktan sonra kendi threadini 10 saniye beklettikten sonra “shutdown()” metodunu çağırarak başlattığı Processor tipindeki threadi sonlandırmak istesin:

public static void main(String[] args) throws InterruptedException {
    Processor processor = new Processor();

    processor.start();

    Thread.sleep(10000);

    processor.shutdown();
}

Buradaki tehlike şu: “processor” threadi bazı sistemlerde, bazı Java gerçekleştirimlerinde “running” değişkeninin dışarıdan herhangi bir müdahale ile değiştirilmeyeceği varsayımından yola çıkarak onun değerini otomatik olarak önbelleğe atar (caching) ve her zaman değeri “true”ymuşcasına davranılır. Bu durum için İngilizce “caching thread-locally” gibi tabirler kullanılmaktadır. Eğer bu önbelleğe atma durumu bizim programımız için tutarsızlıklara sebep olacaksa (örneğin yukarıdaki gibi threadin sonlanmaması durumu) çare söz konusu veri için (yukarıdaki durumda bu veri “running” değişkenidir) “volatile” anahtar kelimesini kullanmaktadır. “volatile” kelimesi “değişken, uçucu” anlamına gelmektedir. Bir diğer anlamı da “tutarlı”dır. Tutarlıdır, yani her başvurduğumuzda değişkenin o anki gerçek değerini döner, önbellekteki değerini değil:

class Processor extends Thread {

    private volatile boolean running = true;

    ...

}

Böylece kodumuzun tüm sistemlerde, tüm Java gerçekleştirimlerinde çalışacağını garanti etmiş olduk.

Reklamlar

Bir Yorum Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s