Sobes.tech
Middle

Kas yra ThreadLocal kintamasis?

sobes.tech AI

Atsakymas iš AI

ThreadLocal — tai klasė, kuri leidžia saugoti duomenis, būdingus kiekvienam srautui. Naudojant ThreadLocal, kiekvienas naudojantis šiuo klasės objektu srautas turės savo kopiją kintamojo, izoliuotą nuo kitų srautų kopijų.

Pagrindinės savybės ir taikymas:

  • Duomenų izoliacija: Padeda išvengti konkurencinio prieigos prie bendrų keičiamų duomenų iš skirtingų srautų problemų, nes kiekvienas srautas dirba su savo kopija.
  • Būsenos valdymas per srautus: Naudinga saugoti informaciją, susijusią su dabartiniu užklausos procesu (pvz., vartotojo ID, transakcijos kontekstas) žiniatinklio programose ar daugiagijų paslaugose, be aiškaus jos perdavimo per daugybę metodų iškvietimų.
  • Inicijavimas: ThreadLocal inicijuojamas pirmą kartą prieinant iš kiekvieno srauto naudojant initialValue() metodą arba aiškiai nustatant reikšmę su set().
  • Gyvenimo ciklas: Duomenys, saugomi ThreadLocal, yra prieinami viso srauto gyvavimo laikotarpiu arba tol, kol jie bus aiškiai pašalinti naudojant remove() metodą.

Pavyzdys naudojimo:

// Sukuriame `ThreadLocal` saugoti dabartinio srauto pavadinimą
private static final ThreadLocal<String> threadName = new ThreadLocal<String>() {
    @Override
    protected String initialValue() {
        // Inicijuojame reikšmę pirmą kartą prieinant
        return Thread.currentThread().getName();
    }
};

public void processRequest() {
    // Nustatome reikšmę dabartiniam srautui
    threadName.set("RequestProcessor-" + Thread.currentThread().getId());

    // Gauname reikšmę dabartiniam srautui
    String currentThreadName = threadName.get();
    System.out.println("Processing request in thread: " + currentThreadName);

    // Pašaliname reikšmę, kad išvengtume atminties nutekėjimo, ypač srautų baseinuose
    threadName.remove();
}

Svarbu prisiminti, kad po naudojimo būtina iškviesti remove(), ypač srautų baseinuose, kad išvengtume atminties nutekėjimo, nes srautas gali būti pakartotinai perduotas, o senoji ThreadLocal reikšmė liks jam pririšta.