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.
public synchronized void method_name(String msg){
//code block
}
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)
https://github.com/thecodeprogram/TheSingleFiles/blob/master/JavaSynchronizedExample.java
Bu yazımızda buraya kadar.
Burak Hamdi TUFAN
Comments
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