Semaphore, lock ve mutex'in aksine senkronize erişimi tamamen bekletmek değil sınırlandırmak için kullanılır. Bu ne demek? Diyelim ki sınırlı bir kaynağımız var, aynı anda 5 thread'in erişimi sistem için sorun olmuyor ama 5'ten fazla thread tarafından o kaynak kullanılmak istendiğinde performans sorunu yaşanıyor ve dolayısıyla kodun o bölümünü bütün thread'lerin erişimine açmak istemiyoruz. Bu durumda sayaçlı bir lock mekanizmasına ihtiyacımız var. İşte o mekanizmanın adı Semaphore.
02 | private Semaphore sem = new Semaphore(0, 5, "YazilimProjesi_Semaphore" ); |
09 | YogunKaynakKullananIslem(); |
Şunu da belirtelim ki lock ve mutex'i sadece kilitleyen thread/proses kilidi kaldırabiliyorken semaphore üzerindeki kilidi herhangi bir thread/proses kaldırabilir. Ayrıca, semaphore da mutex gibi isim verilerek yaratıldığında prosesler arası senkronizasyon için de kullanılabilmektedir.