Yükleniyor...

Çoklu İş Parçacığı ve Eşzamanlılık

Çoklu iş parçacığı ve eşzamanlılık, modern yazılım geliştirme ve sistem mimarisi için kritik kavramlardır. Çoklu iş parçacığı (multithreading), bir uygulama içinde birden fazla iş parçacığının aynı anda çalışmasını sağlar ve bu sayede bağımsız görevlerin paralel olarak yürütülmesine imkân tanır. Eşzamanlılık (concurrency) ise bu iş parçacıklarının sistem kaynaklarını etkin ve güvenli bir şekilde paylaşmasını yönetir, veri bütünlüğünü korur ve performansı optimize eder.
Backend geliştirmede çoklu iş parçacığı ve eşzamanlılık, yüksek trafikli sunucular, gerçek zamanlı uygulamalar, çok kullanıcılı sistemler ve mikroservis tabanlı mimarilerde büyük önem taşır. Önemli kavramlar arasında Java dilinin sözdizimi, iş parçacıklarına güvenli veri yapıları, senkronizasyon algoritmaları ve nesne yönelimli programlama (OOP) prensipleri bulunur. Bu kavramlar, modüler, ölçeklenebilir ve hataya dayanıklı kod yazılmasını mümkün kılar.
Bu eğitimde, okuyucu iş parçacıkları oluşturmayı, paylaşılmış kaynaklara güvenli erişimi, ExecutorService ve iş parçacığı havuzlarının kullanımını, yarış durumları ve deadlockları önlemeyi öğrenecek. Ayrıca bellek sızıntıları, yetersiz hata yönetimi ve verimsiz algoritmalar gibi yaygın hataların önlenmesi ve sistem performansının artırılması konularına da değinilecektir.

Temel Örnek

java
JAVA Code
class Sayac {
private int deger = 0;

public synchronized void arttir() {
deger++;
}

public int degeriAl() {
return deger;
}

}

class SayacThread extends Thread {
private Sayac sayac;

public SayacThread(Sayac sayac) {
this.sayac = sayac;
}

@Override
public void run() {
for (int i = 0; i < 1000; i++) {
sayac.arttir();
}
}

}

public class Main {
public static void main(String\[] args) throws InterruptedException {
Sayac sayac = new Sayac();
Thread t1 = new SayacThread(sayac);
Thread t2 = new SayacThread(sayac);

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

t1.join();
t2.join();

System.out.println("Son değer: " + sayac.degeriAl());
}

}

Bu temel örnek, paylaşılmış bir kaynak olan Sayac sınıfı üzerinde çoklu iş parçacığının nasıl çalıştığını gösterir. arttir() metodunun synchronized olarak işaretlenmesi, aynı anda yalnızca bir iş parçacığının sayacı artırmasını garanti eder ve yarış durumlarını önler. SayacThread sınıfı, Thread sınıfını genişleterek her iş parçacığının 1000 kez arttırma işlemini gerçekleştirmesini sağlar.
main metodunda iki iş parçacığı aynı Sayac nesnesi üzerinde çalıştırılır. join() çağrısı, ana iş parçacığının t1 ve t2’nin bitmesini beklemesini sağlar ve bu sayede doğru sonuç elde edilir. Bu desen, web sunucularında kullanıcı sayımı, log işleme veya eşzamanlı işlemlerde veri bütünlüğünü sağlamak için kullanılabilir. Kod, OOP prensiplerine uygun olarak yapılandırılmış ve senkronizasyon kavramlarını pratik bir şekilde göstermektedir.

Pratik Örnek

java
JAVA Code
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class BankaHesabi {
private double bakiye;
private Lock lock = new ReentrantLock();

public void paraYatir(double miktar) {
lock.lock();
try {
bakiye += miktar;
} finally {
lock.unlock();
}
}

public void paraCek(double miktar) {
lock.lock();
try {
if (bakiye >= miktar) {
bakiye -= miktar;
}
} finally {
lock.unlock();
}
}

public double bakiyeAl() {
return bakiye;
}

}

public class BankaSimulasyonu {
public static void main(String\[] args) throws InterruptedException {
BankaHesabi hesap = new BankaHesabi();
ExecutorService executor = Executors.newFixedThreadPool(5);

for (int i = 0; i < 10; i++) {
executor.execute(() -> hesap.paraYatir(100));
executor.execute(() -> hesap.paraCek(50));
}

executor.shutdown();
while (!executor.isTerminated()) {}

System.out.println("Son bakiye: " + hesap.bakiyeAl());
}

}

Bu gelişmiş örnekte ReentrantLock kullanılarak bakiye işlemlerinin eşzamanlı olarak güvenli şekilde gerçekleştirilmesi sağlanmıştır. ExecutorService, iş parçacıklarının yönetimini merkezi olarak sağlar ve her işlem için ayrı iş parçacığı oluşturmanın maliyetini azaltır. BankaHesabi sınıfı OOP prensiplerine uygun olarak tasarlanmış ve lock mekanizması sayesinde yarış durumları ve deadlocklar önlenmiştir.
Bu desen, finansal sistemler, stok yönetimi veya yüksek eşzamanlı veri işleme senaryolarında oldukça etkilidir. Lock ve iş parçacığı havuzlarının doğru kullanımı, veri güvenliğini garanti ederken sistem performansını artırır ve uygulamaların ölçeklenebilirliğini sağlar.

En iyi uygulamalar şunlardır: paylaşılmış kaynakları synchronized veya Lock ile korumak, iş parçacığı havuzları kullanmak, lock’ları finally bloğunda serbest bırakmak, kritik bölümleri kısa tutmak ve deadlock riskini azaltmak. Yaygın hatalar arasında hatalı lock kullanımı, kontrolsüz istisnalar ve uzun süren kritik işlemler bulunur.
Hata ayıklamada, iş parçacıklarının hareketlerini loglamak ve Java’nın concurrency araçlarını kullanmak önemlidir. Performans optimizasyonu için contention’ı azaltmak, ConcurrentHashMap gibi thread-safe veri yapıları kullanmak ve kritik işlemleri minimal tutmak gerekir. Güvenlik açısından, hassas verilerin korunması ve paylaşılan kaynaklara erişimin kontrollü olması önemlidir.

📊 Referans Tablosu

Element/Concept Description Usage Example
Thread Java’daki temel iş parçacığı birimi Thread t = new Thread(runnable)
Runnable Görev tanımlamak için arayüz class Gorev implements Runnable
synchronized Metot veya blokların senkronizasyonu public synchronized void arttir()
Lock Esnek senkronizasyon mekanizması lock.lock()/lock.unlock()
ExecutorService İş parçacığı havuzu yönetimi Executors.newFixedThreadPool(5)

Çoklu iş parçacığı ve eşzamanlılık öğrenimi, iş parçacıklarını etkin yönetme ve senkronize etme yeteneği kazandırır; bu da yüksek performanslı backend sistemleri, mikroservisler ve dağıtık uygulamalar geliştirmek için kritik öneme sahiptir. İleri seviye olarak Parallel Streams, Fork/Join Framework ve CompletableFuture gibi konular incelenebilir. Başlangıçta basit iş parçacıklarıyla başlanmalı, daha sonra havuzlar ve karmaşık senkronizasyon senaryoları pratik yapılmalıdır. Kaynaklar arasında Java Concurrency dokümantasyonu, ileri seviye kitaplar ve open-source projeler yer alır.

🧠 Bilginizi Test Edin

Başlamaya Hazır

Bilginizi Test Edin

Bu konudaki anlayışınızı pratik sorularla test edin.

4
Sorular
🎯
70%
Geçmek İçin
♾️
Süre
🔄
Deneme

📝 Talimatlar

  • Her soruyu dikkatle okuyun
  • Her soru için en iyi cevabı seçin
  • Quiz'i istediğiniz kadar tekrar alabilirsiniz
  • İlerlemeniz üstte gösterilecek