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:
ThreadLocalinicijuojamas pirmą kartą prieinant iš kiekvieno srauto naudojantinitialValue()metodą arba aiškiai nustatant reikšmę suset(). - Gyvenimo ciklas: Duomenys, saugomi
ThreadLocal, yra prieinami viso srauto gyvavimo laikotarpiu arba tol, kol jie bus aiškiai pašalinti naudojantremove()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.