Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære ThreadLocal | Beste Praksiser for Multitråding
Quizzes & Challenges
Quizzes
Challenges
/
Multitråding i Java

bookThreadLocal

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

ThreadLocalComparison.java

CounterTask.java

CounterTask.java

copy
12345678910111213141516
public 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

ThreadLocalTask.java

ThreadLocalRemoveExample.java

ThreadLocalRemoveExample.java

copy
123456789101112131415161718192021
class 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().

Note
Merk

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?

question mark

Hva er hovedproblemet som bruk av ThreadLocal løser?

Select the correct answer

question mark

Hva er startverdien til en ThreadLocal-variabel når den opprettes med withInitial()-metoden?

Select the correct answer

question mark

Hva skjer hvis du ikke kaller remove()-metoden for en ThreadLocal-variabel i langlivede tråder?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 4

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Suggested prompts:

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

bookThreadLocal

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

ThreadLocalComparison.java

CounterTask.java

CounterTask.java

copy
12345678910111213141516
public 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

ThreadLocalTask.java

ThreadLocalRemoveExample.java

ThreadLocalRemoveExample.java

copy
123456789101112131415161718192021
class 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().

Note
Merk

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?

question mark

Hva er hovedproblemet som bruk av ThreadLocal løser?

Select the correct answer

question mark

Hva er startverdien til en ThreadLocal-variabel når den opprettes med withInitial()-metoden?

Select the correct answer

question mark

Hva skjer hvis du ikke kaller remove()-metoden for en ThreadLocal-variabel i langlivede tråder?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 4
some-alt