Java Thread Çakışması ve Synchonized ifadesi

Java Thread Çakışması ve Synchonized ifadesi

Herkese merhabalar, bu yazımızda sizlerle java programlama dilinde multi thread uygulamalarda sıkça ihtiyacımız olabilecek olan synchronized hakkında konuşacağız.

Hadi başlayalım.

Multithread programlar günümüzde daha fazla işlem yükünün karşlayabilmenin en etkili yollarından birisidir. En büyük özelliklerinden birisi ise daha fazla iş yükünün tek bir process üzerinden karşılanmasıdır.

Multi thread bir programda threadlar aynı process üzerinden çalıştırıldığı için aynı kaynakları paylaşmaktadır. Bu sayede multi process programlara göre daha hafif bir uygulama tasarımı sağlarlar.

Ancak aynı kaynakları kullanırken, threadlar aynı nesneye aynı anda erişmeye çalışabilmektedirler. Bilgisayar programlarında bir nesne aynı anda sadece bir thread tarafından kullanılabilmektedir. Aynı anda ikinci bir thread nesneye erişemez.

Farklı threadların aynı anda aynı nesneye erişimi için kullanılanılan yöntemlerden birisi de synchronized anahtar kelimesidir.

Java programlama dili ile program geliştirirken birden fazla işlem parçacığının erişeceğini düşündüğümüz fonksiyonlar synchronized olarak tanımlanır. Bu sayede herhangi bir işlem parçacığı, synchoronized olan bir fonksiyona eriştiğinde otomatik olarak bloke edilir ve diğer işlem parçacıklarının erişimi bekletilir. Geçerli işlem bittiğinde diğer işlem parçacığının erişimine izin verilir.

Aşağıda örnek bir synchronized blok tanımlaması yapılmıştır.

public synchronized void method_name(String msg){
          //code block
    }
Şimdi synchronized ile bir örnek yapalım ve nasıl çalıştığını görelim.

public class SynchronizedExample {
   
    public static void main(String[] args) {
        LoggerClass w = new LoggerClass();

        DriverThread t1 = new DriverThread(w);
        DriverThread t2 = new DriverThread(w);

        t1.start();
        t2.start();
    }
}

class LoggerClass{
    public void msgLog(String msg){
        System.out.println(msg);
    }
}

class DriverThread extends Thread {
    final LoggerClass w;
    
    DriverThread(LoggerClass _w){
        w=_w;
    }

    @Override
    public void run() {
        synchronized(w) {
            System.out.println("İş parcacigi baslatildi");
            for (int i = 0; i < 5; i++) {
                w.msgLog("Mesaj : " + i);
            }
            System.out.println("İş parcacigi sonlandi");
        }
    }
}
Program çıktısı aşağıdaki gibi olacaktır.

İş parcacigi baslatildi
Mesaj : 0
Mesaj : 1
Mesaj : 2
Mesaj : 3
Mesaj : 4
İş parcacigi sonlandi
İş parcacigi baslatildi
Mesaj : 0
Mesaj : 1
Mesaj : 2
Mesaj : 3
Mesaj : 4
İş parcacigi sonlandi
BUILD SUCCESSFUL (total time: 0 seconds)

Yukarıda görüldüğü üzere threadlar fonksiyona sırayla girmişlerdir ve işlemlerini sırasıyla gerçekleştirmişlerdir.

Eğer Thread içerisindeki run metodundan synchronized bloğunu kaldırıp uygulamayı çalıştırsaydık program çıktısı aşağıdaki gibi thread görevleri birbirlerine girmiş şekilde olacaktır. Buradaki çıktı benim denememdeki çıktıdır, sizlerde sonuç farklı olacaktır.


class DriverThread extends Thread {
    final LoggerClass w;
    
    DriverThread(LoggerClass _w){
        w=_w;
    }

    @Override
    public void run() {
            System.out.println("İş parcacigi baslatildi");
            for (int i = 0; i < 5; i++) {
                w.msgLog("Mesaj : " + i);
            }
            System.out.println("İş parcacigi sonlandi");
    }
}
Program çıktısı

İş parcacigi baslatildi
İş parcacigi baslatildi
Mesaj : 0
Mesaj : 0
Mesaj : 1
Mesaj : 1
Mesaj : 2
Mesaj : 3
Mesaj : 4
Mesaj : 2
İş parcacigi sonlandi
Mesaj : 3
Mesaj : 4
İş parcacigi sonlandi
BUILD SUCCESSFUL (total time: 0 seconds)
Örnek kodların bulunduğu java dosyasına Github üzerinden aşağıdaki link ile ulaşabilirsiniz.
https://github.com/thecodeprogram/TheSingleFiles/blob/master/JavaSynchronizedExample.java

Bu yazımızda buraya kadar.

Burak Hamdi TUFAN


Tags


Share this Post

Send with Whatsapp

Post a Comment

Success! Your comment sent to post. It will be showed after confirmation.
Error! There was an error sending your comment. Check your inputs!

Comments

  • Thecodeprogram User
    AndreaTaf

    Great post. I used to be checking continuously this weblog and I am inspired! Extremely helpful information specially the remaining section :) I take care of such info much. I was looking for this particular information for a very long time. Thanks and good luck.

    2023/05/23 23:42:04