Kas olete töötanud semaforitega oma praktikas?
sobes.tech AI
Vastus AI-lt
Jah, ma olen kasutanud semafore, eriti Android rakendustes mitme niidiga töötamise kontekstis.
Java-s (java.util.concurrent.Semaphore) kasutatakse semafore, et piirata, kui palju niite saavad samaaegselt teatud ressurssile ligi pääseda. See on kasulik olukordades, kus ressurss on piiratud "mahutavusega", näiteks ühenduste pood või piiratud kohtade arv.
Peamised meetodid, millega olen töötanud:
acquire(): blokeerib jooksva niidi, kuni luba on saadaval.acquire(int permits): blokeerib jooksva niidi, kuni nõutud lubade arv on saadaval.release(): tagastab loa semaforile, suurendades saadaval olevate lubade arvu.release(int permits): tagastab määratud arvu lubasid.tryAcquire(): üritab saada luba, ilma niiti blokeerimata.availablePermits(): tagastab praeguse saadaval oleva lubade arvu.
Näide kasutamisest:
import java.util.concurrent.Semaphore;
public class ResourcePool {
private static final int MAX_AVAILABLE = 5;
private final Semaphore permits = new Semaphore(MAX_AVAILABLE, true); // Õigluse semafor
public void useResource() throws InterruptedException {
permits.acquire(); // Lubade taotlus
try {
// Ressursi kasutamise loogika (näiteks ühenduste poodi töötamine)
System.out.println(Thread.currentThread().getName() + " kasutab ressurssi.");
Thread.sleep(1000); // Ressursiga töötamise simulatsioon
} finally {
permits.release(); // Lubade vabastamine
System.out.println(Thread.currentThread().getName() + " lõpetas ressurssi kasutamise.");
}
}
public static void main(String[] args) {
ResourcePool pool = new ResourcePool();
// Mitme niidi loomine, mis püüavad ressurssi kasutada
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
pool.useResource();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
}
Selles näites on semafor permits algselt seadistatud 5 lubadega, mis tähendab, et samaaegselt saavad ainult 5 niiti olla try plokis, kasutades ressurssi. acquire() meetod blokeerib niidid, kui kõik load on kasutusel, kuni teised niidid kutsuvad release().
Semafore kasutatakse piiratud ressursside poodide haldamiseks, kuid tuleb olla ettevaatlik potentsiaalsete probleemide, näiteks deadlock-ide, vältimiseks, kui loa saamine ja vabastamine on valesti hallatud. try-ga ja finally-ga release() kutsumine on hea tava, mis tagab ressursside vabastamise isegi erandite korral.