Middle
Ի՞նչ է ThreadLocal փոփոխականը։
sobes.tech AI
Պատասխան AI-ից
ThreadLocal — դա դաս, որը ապահովում է տվյալների պահպանում, որոնք հատուկ են յուրաքանչյուր հոսքին: Յուրաքանչյուր ThreadLocal-ի օգտագործող հոսքին հասանելի կլինի իր սեփական պատճենը փոփոխականի, որը զատված է մյուս հոսքերի պատճեններից:
Հիմնական հատկություններ և կիրառումներ:
- Տվյալների մեկուսացում: Օգնում է խուսափել մրցակցային մուտքից ընդհանուր փոփոխականների նկատմամբ տարբեր հոսքերում, քանի որ յուրաքանչյուր հոսք աշխատում է իր պատճենով:
- Կարգավիճակի կառավարում հոսքերի միջոցով: Օգտակար է պահելու տեղեկատվությունը, կապված ընթացիկ հարցման հետ (օր., օգտվողի ID, գործարքի կոնտեքստ), վեբ հավելվածներում կամ բազմահոսքային ծառայություններում՝ առանց դրա բացահայտ փոխանցման բազմաթիվ մեթոդային կանչերի միջոցով:
- Ինիցիալիզացիա:
ThreadLocal-ը ինիցիալիզացվում է առաջին մուտքի ժամանակ յուրաքանչյուր հոսքից, օգտագործելովinitialValue()մեթոդը կամ հստակ արժեք սահմանելովset()-ի միջոցով: - Կյանքի ցիկլ:
ThreadLocal-ում պահվող տվյալները հասանելի են հոսքի ողջ կյանքի ընթացքում կամ մինչև դրանց հստակ հեռացումըremove()մեթոդով:
Օրինակ օգտագործում:
// Ստեղծում ենք `ThreadLocal`՝ ընթացիկ հոսքի անունը պահելու համար
private static final ThreadLocal<String> threadName = new ThreadLocal<String>() {
@Override
protected String initialValue() {
// Ինիցիալիզացնում արժեքը առաջին մուտքի ժամանակ
return Thread.currentThread().getName();
}
};
public void processRequest() {
// Հաստատում ենք արժեքը ընթացիկ հոսքի համար
threadName.set("RequestProcessor-" + Thread.currentThread().getId());
// Ստանում ենք արժեքը ընթացիկ հոսքի համար
String currentThreadName = threadName.get();
System.out.println("Processing request in thread: " + currentThreadName);
// Հեռացնում ենք արժեքը՝ հիշողության լիքերը կանխելու համար, հատկապես հոսքային պուլերում
threadName.remove();
}
Կարևոր է հիշել, որ remove()-ի կանչը պետք է կատարվի օգտագործումից հետո, հատկապես հոսքային պուլերում, որպեսզի կանխվի հիշողության լիքերը, քանի որ հոսքը կարող է կրկին փոխանցվել, իսկ ThreadLocal-ի հին արժեքը կմնա կապված նրա հետ։