Pratiklerinizde semaforlar üzerinde çalıştınız mı?
sobes.tech yapay zeka
AI'dan gelen yanıt
Evet, semaforleri kullanmak zorunda kaldım, özellikle Android uygulamalarında çoklu iş parçacığıyla çalışma bağlamında.
Java'daki (java.util.concurrent.Semaphore) semaforlar, belirli bir kaynağa aynı anda erişebilecek iş parçacığı sayısını sınırlamak için kullanılır. Bu, kaynak kapasitesinin sınırlı olduğu senaryolarda faydalıdır, örneğin, bir bağlantı havuzu veya sınırlı sayıda erişilebilir slot.
Çalıştığım temel yöntemler şunlardır:
acquire(): Mevcut iş parçacığını, izin kullanılabilir olana kadar engeller.acquire(int permits): Belirtilen sayıda izin kullanılabilir olana kadar iş parçacığını engeller.release(): Semafora bir izin geri verir ve kullanılabilir izin sayısını artırır.release(int permits): Belirtilen sayıda izin geri verir.tryAcquire(): İş parçacığını engellemeden izin almaya çalışır.availablePermits(): Mevcut kullanılabilir izin sayısını döndürür.
Kullanım örneği:
import java.util.concurrent.Semaphore;
public class ResourcePool {
private static final int MAX_AVAILABLE = 5;
private final Semaphore permits = new Semaphore(MAX_AVAILABLE, true); // Adil semafor
public void useResource() throws InterruptedException {
permits.acquire(); // İzin talep et
try {
// Kaynağın kullanımıyla ilgili mantık (örneğin, bağlantı havuzuyla çalışma)
System.out.println(Thread.currentThread().getName() + " kaynağı kullanıyor.");
Thread.sleep(1000); // Kaynakla çalışma simülasyonu
} finally {
permits.release(); // İzni serbest bırak
System.out.println(Thread.currentThread().getName() + " kaynağı kullanmayı bitirdi.");
}
}
public static void main(String[] args) {
ResourcePool pool = new ResourcePool();
// Kaynağı kullanmaya çalışan birkaç iş parçacığı oluşturuyoruz
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
pool.useResource();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
}
Bu örnekte, permits semaforu 5 izinle başlatılır, bu da aynı anda yalnızca 5 iş parçacığının kaynak kullanan try bloğu içinde olabileceği anlamına gelir. acquire() yöntemi, tüm izinler kullanıldığında iş parçacıklarını engeller ve diğer iş parçacıkları release() çağırana kadar bekletir.
Semaforlar, sınırlı kaynak havuzlarına erişimi yönetmek için kullanışlıdır, ancak izinlerin alınması ve serbest bırakılması doğru şekilde yönetilmediğinde potansiyel sorunlar, örneğin deadlock'lar, oluşabilir. try ile finally bloğunu kullanmak, istisnalar durumunda bile kaynakların serbest bırakılmasını sağlamak için iyi bir uygulamadır.