Sobes.tech
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-ի հին արժեքը կմնա կապված նրա հետ։