ThreadLocal
ThreadLocal gjør det mulig å unngå mekanismer relatert til flertråding som synkronisering, ettersom data fra ThreadLocal kun er tilgjengelig innenfor én enkelt tråd.
Tenk deg en bankapplikasjon hvor hver kunde har sin egen konto. Hvis flere kunder bruker applikasjonen samtidig, bør deres kontoer forbli adskilt. Ved å bruke ThreadLocal får hver tråd (kunde) sin egen instans av data (konto), noe som sikrer at den ikke forstyrrer andre tråder.
Hvordan bruke ThreadLocal
ThreadLocal tilbyr en get() metode og en set() metode, som er selvforklarende.
get() – henter verdien fra ThreadLocal-variabelen.
ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.get();
set() – setter verdien til ThreadLocal-variabelen.
ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.set(10);
La oss lage et program for å sammenligne en enkel variabel med ThreadLocal.
Hver tråd vil ha sin egen distinkte threadLocalCounter, mens verdien til sharedCounter vil bli endret og delt mellom alle tråder. Programmets utdata vil vise at threadLocalCounter-verdiene er unike for hver tråd, mens sharedCounter vil gjenspeile et felles resultat for alle tråder, som kan variere avhengig av rekkefølgen trådene kjøres i.
ThreadLocalComparison.java
CounterTask.java
12345678910111213141516public class ThreadLocalComparison { public static void main(String[] args) { CounterTask counterTask = new CounterTask(); // Create threads for demonstrating the behavior Thread thread1 = new Thread(counterTask); Thread thread2 = new Thread(counterTask); Thread thread3 = new Thread(counterTask); // Start the threads thread1.start(); thread2.start(); thread3.start(); } }
Og etter at dette programmet kjører for oss, får vi følgende resultat:
Shared Counter: 1
Shared Counter: 2
Shared Counter: 3
ThreadLocal Counter: 1
ThreadLocal Counter: 1
ThreadLocal Counter: 1
Som du kan se, blir variabelen sharedCounter økt på tvers av forskjellige tråder, mens variabelen threadLocalCounter beholder samme verdi i hver tråd, fordi hver tråd har sin egen threadLocalCounter-instans som er uavhengig av andre tråder.
Som du kanskje har lagt merke til, inneholder koden en statisk metode ThreadLocal.withInitial() som setter en initialverdi for variabelen når den opprettes.
ThreadLocal<Integer> threadLocalCounter = ThreadLocal.withInitial(() -> 0);
Metoden remove() i klassen ThreadLocal brukes til å fjerne verdien som er tilknyttet den nåværende tråden.
ThreadLocalTask.java
ThreadLocalRemoveExample.java
123456789101112131415161718192021class ThreadLocalTask implements Runnable { // Define a `ThreadLocal` variable with an initial value private static ThreadLocal<String> threadLocalValue = new ThreadLocal<>(); @Override public void run() { // Set a value in the `ThreadLocal` for this thread String threadName = Thread.currentThread().getName(); threadLocalValue.set(threadName + " Value"); // Print the current value System.out.println(threadName + " - ThreadLocal Value before removal: " + threadLocalValue.get()); // Remove the value associated with the current thread threadLocalValue.remove(); // Print the value after removal System.out.println(threadName + " - ThreadLocal Value after removal: " + threadLocalValue.get()); } }
Som et resultat av programutførelsen:
Thread-0 - ThreadLocal Value before removal: Thread-0 Value
Thread-0 - ThreadLocal Value after removal: null
Thread-1 - ThreadLocal Value before removal: Thread-1 Value
Thread-1 - ThreadLocal Value after removal: null
Programmet tildeler en unik verdi til ThreadLocal for hver tråd og viser denne verdien før og etter at remove()-metoden kalles. Etter at verdien er fjernet med remove(), returnerer ThreadLocal null ved påfølgende kall til get().
Data som ligger i ThreadLocal blir ikke slettet av seg selv og må eksplisitt slettes!
Hvorfor må jeg frigjøre en verdi?
Å frigjøre en verdi er avgjørende for å unngå minnelekkasjer. ThreadLocal holder verdier knyttet til tråder i et spesielt kart som er bundet til trådene. Hvis en verdi ikke fjernes, forblir den i kartet selv etter at trådens bruk er ferdig, noe som fører til unødvendige objekter i minnet og til slutt minnelekkasjer.
1. Hva er hovedproblemet som bruk av ThreadLocal løser?
2. Hva er startverdien til en ThreadLocal-variabel når den opprettes med withInitial()-metoden?
3. Hva skjer hvis du ikke kaller remove()-metoden for en ThreadLocal-variabel i langlivede tråder?
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Can you explain more about how ThreadLocal prevents memory leaks?
What are some common use cases for ThreadLocal in real-world applications?
How does ThreadLocal differ from using synchronized blocks or other thread-safety mechanisms?
Awesome!
Completion rate improved to 3.33
ThreadLocal
Sveip for å vise menyen
ThreadLocal gjør det mulig å unngå mekanismer relatert til flertråding som synkronisering, ettersom data fra ThreadLocal kun er tilgjengelig innenfor én enkelt tråd.
Tenk deg en bankapplikasjon hvor hver kunde har sin egen konto. Hvis flere kunder bruker applikasjonen samtidig, bør deres kontoer forbli adskilt. Ved å bruke ThreadLocal får hver tråd (kunde) sin egen instans av data (konto), noe som sikrer at den ikke forstyrrer andre tråder.
Hvordan bruke ThreadLocal
ThreadLocal tilbyr en get() metode og en set() metode, som er selvforklarende.
get() – henter verdien fra ThreadLocal-variabelen.
ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.get();
set() – setter verdien til ThreadLocal-variabelen.
ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.set(10);
La oss lage et program for å sammenligne en enkel variabel med ThreadLocal.
Hver tråd vil ha sin egen distinkte threadLocalCounter, mens verdien til sharedCounter vil bli endret og delt mellom alle tråder. Programmets utdata vil vise at threadLocalCounter-verdiene er unike for hver tråd, mens sharedCounter vil gjenspeile et felles resultat for alle tråder, som kan variere avhengig av rekkefølgen trådene kjøres i.
ThreadLocalComparison.java
CounterTask.java
12345678910111213141516public class ThreadLocalComparison { public static void main(String[] args) { CounterTask counterTask = new CounterTask(); // Create threads for demonstrating the behavior Thread thread1 = new Thread(counterTask); Thread thread2 = new Thread(counterTask); Thread thread3 = new Thread(counterTask); // Start the threads thread1.start(); thread2.start(); thread3.start(); } }
Og etter at dette programmet kjører for oss, får vi følgende resultat:
Shared Counter: 1
Shared Counter: 2
Shared Counter: 3
ThreadLocal Counter: 1
ThreadLocal Counter: 1
ThreadLocal Counter: 1
Som du kan se, blir variabelen sharedCounter økt på tvers av forskjellige tråder, mens variabelen threadLocalCounter beholder samme verdi i hver tråd, fordi hver tråd har sin egen threadLocalCounter-instans som er uavhengig av andre tråder.
Som du kanskje har lagt merke til, inneholder koden en statisk metode ThreadLocal.withInitial() som setter en initialverdi for variabelen når den opprettes.
ThreadLocal<Integer> threadLocalCounter = ThreadLocal.withInitial(() -> 0);
Metoden remove() i klassen ThreadLocal brukes til å fjerne verdien som er tilknyttet den nåværende tråden.
ThreadLocalTask.java
ThreadLocalRemoveExample.java
123456789101112131415161718192021class ThreadLocalTask implements Runnable { // Define a `ThreadLocal` variable with an initial value private static ThreadLocal<String> threadLocalValue = new ThreadLocal<>(); @Override public void run() { // Set a value in the `ThreadLocal` for this thread String threadName = Thread.currentThread().getName(); threadLocalValue.set(threadName + " Value"); // Print the current value System.out.println(threadName + " - ThreadLocal Value before removal: " + threadLocalValue.get()); // Remove the value associated with the current thread threadLocalValue.remove(); // Print the value after removal System.out.println(threadName + " - ThreadLocal Value after removal: " + threadLocalValue.get()); } }
Som et resultat av programutførelsen:
Thread-0 - ThreadLocal Value before removal: Thread-0 Value
Thread-0 - ThreadLocal Value after removal: null
Thread-1 - ThreadLocal Value before removal: Thread-1 Value
Thread-1 - ThreadLocal Value after removal: null
Programmet tildeler en unik verdi til ThreadLocal for hver tråd og viser denne verdien før og etter at remove()-metoden kalles. Etter at verdien er fjernet med remove(), returnerer ThreadLocal null ved påfølgende kall til get().
Data som ligger i ThreadLocal blir ikke slettet av seg selv og må eksplisitt slettes!
Hvorfor må jeg frigjøre en verdi?
Å frigjøre en verdi er avgjørende for å unngå minnelekkasjer. ThreadLocal holder verdier knyttet til tråder i et spesielt kart som er bundet til trådene. Hvis en verdi ikke fjernes, forblir den i kartet selv etter at trådens bruk er ferdig, noe som fører til unødvendige objekter i minnet og til slutt minnelekkasjer.
1. Hva er hovedproblemet som bruk av ThreadLocal løser?
2. Hva er startverdien til en ThreadLocal-variabel når den opprettes med withInitial()-metoden?
3. Hva skjer hvis du ikke kaller remove()-metoden for en ThreadLocal-variabel i langlivede tråder?
Takk for tilbakemeldingene dine!