Да ли сте радили са семафорима у својој пракси?
sobes.tech АИ
Одговор од АИ
Da, koristio sam semafore, posebno u kontekstu rada sa višestrukim nitima u Android aplikacijama.
Semafori u Javi (java.util.concurrent.Semaphore) se koriste za ograničavanje broja niti koje mogu istovremeno pristupiti određenom resursu. Ovo je korisno u scenarijima gde resurs ima ograničeni "kapacitet", na primer, pool konekcija ili ograničen broj dostupnih slotova.
Glavne metode sa kojima sam radio:
acquire(): Blokira trenutnu nit dok ne postane dostupno odobrenje.acquire(int permits): Blokira trenutnu nit dok ne postane dostupno navedeno broj odobrenja.release(): Vraća odobrenje semaforu, povećavajući broj dostupnih odobrenja.release(int permits): Vraća navedeni broj odobrenja.tryAcquire(): Pokušava da dobije odobrenje, bez blokiranja niti.availablePermits(): Vraća trenutni broj dostupnih odobrenja.
Primer upotrebe:
import java.util.concurrent.Semaphore;
public class ResourcePool {
private static final int MAX_AVAILABLE = 5;
private final Semaphore permits = new Semaphore(MAX_AVAILABLE, true); // Pravedan semafor
public void useResource() throws InterruptedException {
permits.acquire(); // Zahtev za odobrenjem
try {
// Logika korišćenja resursa (npr. rad sa poolom konekcija)
System.out.println(Thread.currentThread().getName() + " koristi resurs.");
Thread.sleep(1000); // Simulacija rada sa resursom
} finally {
permits.release(); // Oslobađanje odobrenja
System.out.println(Thread.currentThread().getName() + " završava sa korišćenjem resursa.");
}
}
public static void main(String[] args) {
ResourcePool pool = new ResourcePool();
// Kreiranje više niti koje će pokušati da koriste resurs
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
pool.useResource();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
}
U ovom primeru, semafor permits je inicijalizovan sa 5 odobrenja, što znači da istovremeno samo 5 niti može biti unutar bloka try koji koristi resurs. Metoda acquire() blokira niti ako su sva odobrenja zauzeta, dok druge niti ne pozovu release().
Semafori su korisni za upravljanje pristupom ograničenim poolovima resursa, ali je važno obratiti pažnju na potencijalne probleme poput deadlock-ova, ako pogrešno upravljamo dobijanjem i oslobađanjem odobrenja. Korišćenje try sa finally za pozivanje release() je dobra praksa koja osigurava oslobađanje resursa čak i u slučaju izuzetaka.