Concurrency(Java) nedir?
Concurrency konusunu işlemeden önce bazı temel kavramları öğrenmemiz gerekmektedir.
- CPU
- Process
- Thread
CPU(Central Processing Unit) : Verileri işleyen ve yazılımın talep ettiği aritmetik veya mantıksal işlemleri yapan/gerçekleştiren birim CPU’dur.
Process : İşletim sistemindeki her bir uygulama bir process’i temsil eder diyebiliriz
Thread için, uygulamanın içerisindeki, uygulamanın çalışmasını sağlayan işçiler diyebiliriz. Tabi basit bir uygulama yazmak için thread oluşturmanıza yani yeni bir işçi yaratmanıza gerek yoktur çünkü zaten bir ana(main) thread vardır ve yeni bir thread oluşturmazsanız, uygulama o thread üzerinde çalışır.
Tabi bu durum tüm diller için geçerli değildir. Örneğin node.js single thread bir dildir.
Artık Concurrency konusu işleyebiliriz ve üzerine konuşabiliriz.
Birden fazla aritmetik veya mantıksal işlemin yapılması durumudur. Kelime ‘eşzamanlılık’ anlamını taşır ve genellikle paralel işlem yapma ile karıştırılır. Birazdan zaten farklarına değineceğiz.
Tek ve aynı zamanda birden fazla işi paralel yapma durumu ise Parallelism’dir.
Şimdi gelelim aradaki farka
“Concurrency” birden fazla sayıdaki işi tek bir core(single proccessing unit) ‘da yapar fakat “Parallelism” ’de çoklu core(multiple processing units)’ a ihtiyaç duyar.
“Parallelism” ‘i kavramak kolay, 2 farklı işi paralel olarak 2 core’da yapılması normal.
Peki 2 iş, tek core’da nasıl aynanda yapılabiliyor?
Aslında aynanda yapılmıyor. Thread’i bir işçi gibi düşünün. O işçi bir işe başlıyor, o iş devam ederken bir başka işi de yapmaya başlıyor.
Örneğin bir işçi bir havuzu doldurmak için vanayı açtı ve havuzun dolmasını bekliyor. Vanayı açması ve havuzu doldurması bir iş fakat o işin tamamlanması için başında beklemesine gerek yok. Havuz dolarken başka bir işle daha uğraşabilir. İşte buna “Concurrency” diyoruz.
Eğer iki vana olsaydı ve iki işçi iki vanayı aynanda açmış olsalardı, buna da “Parallelism” diyecektik.
Görsel üzerinden bir başka örnek daha verelim.
Eğer iki kasanız yoksa, 2 kasiyerinizin olmasının bir anlamı olur mu? Market sahibiyseniz, önce ikinci kasayı alırsınız sonra ikinci kasiyeri. Eğer 2 core’unuz yoksa, ikinci thread’i açmanın da bir anlamı olmayabilir
Ama tek core’da da yani aynı kasada tek thread yani tek kasiyer müşterinin ürünlerini koymasını beklerken başka bir işlem yapabilir.(Concurrency)
İki kasa, iki kasiyer aynanda 1'er tane müşteri ile ilgilenebilirler (Parallelism)
Şimdi daha teknik bir örnek üzerinden inceleyelim
public class ThreadExample {
public static void main(String[] args) throws InterruptedException { new Thread(()-> System.out.println(Thread.currentThread().getName())); //Thread 1 new Thread(()-> System.out.println(Thread.currentThread().getName())); //Thread 2 }
}
2 Adet kendi oluşturduğumuz thread’imiz var. Tabi bir de main thread. 4 core bir makina üzerinde çalışıyor.
Thread scheduler, thread’leri core’lara yönlendirip işlenmesini sağlıyor. 2 thread, 4 core. Öyle ise paralel çalışabilirler, değil mi?
Peki ya tek core bir makina olsaydı ve yine 2 thread oluştursaydık?
Tabi bu tür durumlarda, 2 thread de aynı sınıfa erişmek istediklerinde aynı sınıf değişkenleri üzerinde de düzenleme yapmaları gerekebilir. Yani aynı process’in (uygulamanın) içindeki thread’ler ortak memory alanını kullanmaktadır. Bu da soruna sebep (visibility problem) olur. Bir sonraki yazıda bu konuya da değineceğim.
Umarım faydalı olmuştur, sevgi ve sağlıkla kalın.