Sobes.tech
Middle+

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.