Pracoval jste ve své praxi se semafory?
sobes.tech AI
Odpověď od AI
Ano, používal jsem semafory, zejména v souvislosti s vícevláknovým zpracováním v Android aplikacích.
Semafory v Java (java.util.concurrent.Semaphore) slouží k omezení počtu vláken, která mohou současně přistupovat k určitému zdroji. To je užitečné v scénářích, kde má zdroj omezenou "kapacitu", například pool připojení nebo omezený počet dostupných slotů.
Hlavní metody, se kterými jsem pracoval:
acquire(): Zablokuje aktuální vlákno, dokud není dostupné povolení.acquire(int permits): Zablokuje aktuální vlákno, dokud není dostupný požadovaný počet povolení.release(): Vrátí povolení semaforu, čímž zvýší počet dostupných povolení.release(int permits): Vrátí požadovaný počet povolení.tryAcquire(): Pokusí se získat povolení bez blokování vlákna.availablePermits(): Vrátí aktuální počet dostupných povolení.
Příklad použití:
import java.util.concurrent.Semaphore;
public class ResourcePool {
private static final int MAX_AVAILABLE = 5;
private final Semaphore permits = new Semaphore(MAX_AVAILABLE, true); // Spravedlivý semafor
public void useResource() throws InterruptedException {
permits.acquire(); // Požadavek na povolení
try {
// Logika použití zdroje (například práce s poolem připojení)
System.out.println(Thread.currentThread().getName() + " používá zdroj.");
Thread.sleep(1000); // Simulace práce se zdrojem
} finally {
permits.release(); // Uvolnění povolení
System.out.println(Thread.currentThread().getName() + " dokončil použití zdroje.");
}
}
public static void main(String[] args) {
ResourcePool pool = new ResourcePool();
// Vytvoření několika vláken, která se pokusí použít zdroj
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
pool.useResource();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
}
V tomto příkladu je semafor permits inicializován s 5 povoleními, což znamená, že současně může být uvnitř bloku try, který používá zdroj, pouze 5 vláken. Metoda acquire() blokuje vlákna, pokud jsou všechna povolení obsazena, dokud jiná vlákna nevolají release().
Semafory jsou užitečné pro řízení přístupu k omezeným poolům zdrojů, ale je třeba dávat pozor na potenciální problémy, jako jsou deadlocky, pokud nesprávně spravujete získávání a uvolňování povolení. Použití try s finally pro volání release() je dobrá praxe, která zajišťuje uvolnění zdrojů i v případě výjimek.