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:
ThreadLocalje inicializován při prvním přístupu z každého vlákna pomocí metodyinitialValue()nebo explicitním nastavením hodnoty pomocíset(). - Životní cyklus: Data uložená v
ThreadLocaljsou dostupná po celou dobu života vlákna nebo dokud nejsou explicitně odstraněna pomocí metodyremove().
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.