Sobes.tech
Middle

Co je proměnná ThreadLocal?

sobes.tech AI

Odpověď od AI

ThreadLocal — je třída, která umožňuje ukládání dat specifických pro každý vlákno. Každé vlákno používající ThreadLocal bude mít vlastní kopii proměnné, izolovanou od kopií v jiných vláknech.

Hlavní vlastnosti a použití:

  • Izolace dat: Pomáhá předcházet problémům s konkurenčním přístupem ke sdíleným měnitelným datům z různých vláken, protože každé vlákno pracuje se svou kopií.
  • Správa stavu podle vlákna: Užitečné pro ukládání informací souvisejících s aktuální žádostí (například ID uživatele, kontext transakce) v webových aplikacích nebo vícevláknových službách, aniž by bylo nutné je explicitně předávat přes více volání metod.
  • Inicializace: ThreadLocal je inicializován při prvním přístupu z každého vlákna pomocí metody initialValue() nebo explicitním nastavením hodnoty pomocí set().
  • Životní cyklus: Data uložená v ThreadLocal jsou dostupná po celou dobu života vlákna nebo dokud nejsou explicitně odstraněna pomocí metody remove().

Příklad použití:

// Vytvoříme `ThreadLocal` pro uložení názvu aktuálního vlákna
private static final ThreadLocal<String> threadName = new ThreadLocal<String>() {
    @Override
    protected String initialValue() {
        // Inicializace hodnoty při prvním přístupu
        return Thread.currentThread().getName();
    }
};

public void processRequest() {
    // Nastavení hodnoty pro aktuální vlákno
    threadName.set("RequestProcessor-" + Thread.currentThread().getId());

    // Získání hodnoty pro aktuální vlákno
    String currentThreadName = threadName.get();
    System.out.println("Zpracování požadavku ve vlákně: " + currentThreadName);

    // Odstranění hodnoty, aby se předešlo únikům paměti, zejména v poolích vláken
    threadName.remove();
}

Je důležité volat remove() po ukončení použití, zejména v poolích vláken, aby se zabránilo únikům paměti, protože vlákno může být znovu použito a stará hodnota ThreadLocal zůstane k němu přiřazena.