Java Semaphore Nedir? Nasıl Kullanılır? (Multithreading)

Osman Doğan
2 min readDec 26, 2022
Java Semaphore Nedir?

Java’da Semaphore, aynı anda kaç farklı thread’in çalışabilmesini belirleyebilmemize imkan sağlayan bir yapıdır. Örnek vermek gerekirse aynı anda en fazla 3 thread çalışsın diyebiliriz. Böylelikle çalışmaya koyulan bu üç thread’den biri işini bitirmeden yani bir thread çalışmaya başlayamaz. Biri işini tamamlayıp sonlandıktan sonra, onun yerine bir yenisi girer ve çalışmaya başlar.

Daha iyi anlaşılması için bu yapıyı bir otopark’a benzetebiliriz. En fazla 3 araçlık park alanı bulunan bir otopark düşünün. Doğal olarak biri çıkmadan herhangi bir yeni araç otoparka giriş yapamaz. Bir aracın giriş yapabilimesi için, en az birinin çıkmış olması gereklidir. Semaphore'lar bize bir kaynağa aynı anda kaç thread’in erişebileceğini belirleme imkanı verir. Bu da ortaya çıkabilecek bazı problemlerin önüne geçer.

Semaphore kullanımı CountDownLatch kullanımına oldukça benzer. Thread oluşturmak için bir class oluşturmamız içerisinde Semaphore nesnesi ekleyip bunu Constructor yardımı ile almamız gerekir.

Bunun dışında acquire() ve release() şeklinde iki ana metot vardır.

acquire() kaynağa erişim için kullanılır. Eğer erişim sağlanabilirse, Thread çalışmaya başlar. Eğer izin yoksa thread izin gelene kadar kilitlenir. tryAcquire()'metodu ondan farklı olarak erişim sağlamaya çalışır erişim sağlarsa true, sağlayamazsa false return eder.

release() erişimi serbest bırakmak için kullanılır. Yani bir thread işini bitirdiğinde, yerini başka bir thread’a bırakmak için ayrılırken release() işlemi yapar.

import java.util.concurrent.Semaphore;

public class SemaphoreEx {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(2); // ayni anda 2 thread calisabilir
System.out.println("Aynı anda çalışabilecek Thread sayısı : " + semaphore.availablePermits());


CarPark car1 = new CarPark(semaphore, "Car 1");
CarPark car2 = new CarPark(semaphore, "Car 2");
CarPark car3 = new CarPark(semaphore, "Car 3");
CarPark car4 = new CarPark(semaphore, "Car 4");
car1.start();
car2.start();
car3.start();
car4.start();

}
}


class CarPark extends Thread {
Semaphore semaphore;
String threadname;

public CarPark(Semaphore semaphore, String threadname) {
super(threadname);
this.semaphore = semaphore;
}

@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " Otoparka Girmeye Calisiyor");
semaphore.acquire(); // Giris izni istedik
System.out.println(Thread.currentThread().getName() + " otoparke girdi");
Thread.sleep(6000); // 6 saniye bekledi
semaphore.release(); // Cikis yaptik
System.out.println(Thread.currentThread().getName() + " Cikis yapti");

} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}

Semaphore kullanımına örnek olarak yukarıdaki koda bir göz atabilirsiniz.

--

--