Sobes.tech
Middle

Čo je premenná ThreadLocal?

sobes.tech AI

Odpoveď od AI

ThreadLocal — je trieda, ktorá umožňuje ukladať údaje špecifické pre každý vlákno. Každé vlákno používajúce ThreadLocal bude mať vlastnú kópiu premennej, izolovanú od kópií v iných vláknach.

Hlavné vlastnosti a použitia:

  • Izolácia údajov: Pomáha predchádzať problémom s konkurenčnym prístupom ku zdieľaným meniteľným údajom z rôznych vlákien, pretože každé vlákno pracuje so svojou vlastnou kópiou.
  • Správa stavu podľa vlákna: Užitečné na ukladanie informácií súvisiacich s aktuálnou požiadavkou (napríklad ID používateľa, kontext transakcie) v webových aplikáciách alebo viacvláknových službách bez nutnosti ich explicitne prenášať cez viaceré volania metód.
  • Inicializácia: ThreadLocal sa inicializuje pri prvom prístupe z každého vlákna pomocou metódy initialValue() alebo explicitným nastavením hodnoty pomocou set().
  • Životný cyklus: Dáta uložené v ThreadLocal sú dostupné počas celého života vlákna alebo do ich explicitného odstránenia pomocou remove().

Príklad použitia:

// Vytvoríme `ThreadLocal` na uloženie názvu aktuálneho vlákna
private static final ThreadLocal<String> threadName = new ThreadLocal<String>() {
    @Override
    protected String initialValue() {
        // Inicializácia hodnoty pri prvom prístupe
        return Thread.currentThread().getName();
    }
};

public void processRequest() {
    // Nastavíme hodnotu pre aktuálne vlákno
    threadName.set("RequestProcessor-" + Thread.currentThread().getId());

    // Získame hodnotu pre aktuálne vlákno
    String currentThreadName = threadName.get();
    System.out.println("Spracovanie požiadavky vo vlákne: " + currentThreadName);

    // Odstránime hodnotu, aby sme predišli únikom pamäte, najmä v pooloch vlákien
    threadName.remove();
}

Je dôležité volať remove() po ukončení použitia, najmä v pooloch vlákien, aby sa predišlo únikom pamäte, pretože vlákno môže byť znovu použité a stará hodnota ThreadLocal zostane k nemu pripojená.