Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Threadlocal | Meilleures Pratiques de la Programmation Multithread
Multithreading en Java

bookThreadlocal

ThreadLocal permet d’éviter les mécanismes liés au multithreading tels que la synchronisation, car les données provenant de ThreadLocal sont accessibles uniquement au sein d’un même thread.

Imaginons une application bancaire où chaque client possède son propre compte. Si plusieurs clients utilisent l’application simultanément, leurs comptes doivent rester distincts. En utilisant ThreadLocal, chaque thread (client) dispose de sa propre instance de données (compte), garantissant ainsi qu’il n’interfère pas avec les autres threads.

Comment utiliser ThreadLocal

ThreadLocal fournit une méthode get() et une méthode set(), dont l'utilisation est explicite.

get() – récupère la valeur de la variable ThreadLocal.

ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.get();

set() – définit la valeur de la variable ThreadLocal.

ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.set(10);

Création d'un programme pour comparer une variable simple avec ThreadLocal.

Chaque thread disposera de son propre threadLocalCounter distinct, tandis que la valeur de sharedCounter sera modifiée et partagée entre tous les threads. Le résultat du programme démontrera que les valeurs de threadLocalCounter sont uniques pour chaque thread, alors que sharedCounter reflétera un résultat commun à tous les threads, susceptible de varier selon l'ordre d'exécution des threads.

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(); } }

Et après l'exécution de ce programme, nous obtenons le résultat suivant :

Shared Counter: 1
Shared Counter: 2
Shared Counter: 3
ThreadLocal Counter: 1
ThreadLocal Counter: 1
ThreadLocal Counter: 1

Comme vous pouvez le constater, la variable sharedCounter est incrémentée à travers différents threads, tandis que la variable threadLocalCounter conserve la même valeur dans chaque thread, car chaque thread possède sa propre instance de threadLocalCounter qui est indépendante des autres threads.

Comme vous avez peut-être pu l'observer, le code inclut une méthode statique ThreadLocal.withInitial() qui définit une valeur initiale pour la variable lors de sa création.

ThreadLocal<Integer> threadLocalCounter = ThreadLocal.withInitial(() -> 0);

La méthode remove() dans la classe ThreadLocal est utilisée pour supprimer la valeur associée au thread courant.

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()); } }

Résultat de l'exécution du programme :

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

Le programme attribue une valeur unique à ThreadLocal pour chaque thread et affiche cette valeur avant et après l'appel de la méthode remove(). Après avoir supprimé la valeur avec remove(), ThreadLocal retourne null lors des appels suivants à get().

Note
Remarque

Les données présentes dans ThreadLocal ne sont pas supprimées automatiquement et doivent être supprimées explicitement !

Pourquoi dois-je libérer une valeur ?

Libérer une valeur est essentiel pour éviter les fuites de mémoire. ThreadLocal conserve les valeurs associées aux threads dans une carte spéciale qui est liée aux threads. Si une valeur n'est pas supprimée, elle reste dans la carte même après la fin d'utilisation du thread, ce qui entraîne la persistance d'objets inutiles en mémoire et conduit finalement à des fuites de mémoire.

1. Quel est le principal problème que l'utilisation de ThreadLocal permet de résoudre ?

2. Quelle est la valeur initiale d'une variable ThreadLocal lorsqu'elle est créée avec la méthode withInitial() ?

3. Que se passe-t-il si vous n'appelez pas la méthode remove() pour une variable ThreadLocal dans des threads de longue durée ?

question mark

Quel est le principal problème que l'utilisation de ThreadLocal permet de résoudre ?

Select the correct answer

question mark

Quelle est la valeur initiale d'une variable ThreadLocal lorsqu'elle est créée avec la méthode withInitial() ?

Select the correct answer

question mark

Que se passe-t-il si vous n'appelez pas la méthode remove() pour une variable ThreadLocal dans des threads de longue durée ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 4

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

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

Glissez pour afficher le menu

ThreadLocal permet d’éviter les mécanismes liés au multithreading tels que la synchronisation, car les données provenant de ThreadLocal sont accessibles uniquement au sein d’un même thread.

Imaginons une application bancaire où chaque client possède son propre compte. Si plusieurs clients utilisent l’application simultanément, leurs comptes doivent rester distincts. En utilisant ThreadLocal, chaque thread (client) dispose de sa propre instance de données (compte), garantissant ainsi qu’il n’interfère pas avec les autres threads.

Comment utiliser ThreadLocal

ThreadLocal fournit une méthode get() et une méthode set(), dont l'utilisation est explicite.

get() – récupère la valeur de la variable ThreadLocal.

ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.get();

set() – définit la valeur de la variable ThreadLocal.

ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.set(10);

Création d'un programme pour comparer une variable simple avec ThreadLocal.

Chaque thread disposera de son propre threadLocalCounter distinct, tandis que la valeur de sharedCounter sera modifiée et partagée entre tous les threads. Le résultat du programme démontrera que les valeurs de threadLocalCounter sont uniques pour chaque thread, alors que sharedCounter reflétera un résultat commun à tous les threads, susceptible de varier selon l'ordre d'exécution des threads.

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(); } }

Et après l'exécution de ce programme, nous obtenons le résultat suivant :

Shared Counter: 1
Shared Counter: 2
Shared Counter: 3
ThreadLocal Counter: 1
ThreadLocal Counter: 1
ThreadLocal Counter: 1

Comme vous pouvez le constater, la variable sharedCounter est incrémentée à travers différents threads, tandis que la variable threadLocalCounter conserve la même valeur dans chaque thread, car chaque thread possède sa propre instance de threadLocalCounter qui est indépendante des autres threads.

Comme vous avez peut-être pu l'observer, le code inclut une méthode statique ThreadLocal.withInitial() qui définit une valeur initiale pour la variable lors de sa création.

ThreadLocal<Integer> threadLocalCounter = ThreadLocal.withInitial(() -> 0);

La méthode remove() dans la classe ThreadLocal est utilisée pour supprimer la valeur associée au thread courant.

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()); } }

Résultat de l'exécution du programme :

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

Le programme attribue une valeur unique à ThreadLocal pour chaque thread et affiche cette valeur avant et après l'appel de la méthode remove(). Après avoir supprimé la valeur avec remove(), ThreadLocal retourne null lors des appels suivants à get().

Note
Remarque

Les données présentes dans ThreadLocal ne sont pas supprimées automatiquement et doivent être supprimées explicitement !

Pourquoi dois-je libérer une valeur ?

Libérer une valeur est essentiel pour éviter les fuites de mémoire. ThreadLocal conserve les valeurs associées aux threads dans une carte spéciale qui est liée aux threads. Si une valeur n'est pas supprimée, elle reste dans la carte même après la fin d'utilisation du thread, ce qui entraîne la persistance d'objets inutiles en mémoire et conduit finalement à des fuites de mémoire.

1. Quel est le principal problème que l'utilisation de ThreadLocal permet de résoudre ?

2. Quelle est la valeur initiale d'une variable ThreadLocal lorsqu'elle est créée avec la méthode withInitial() ?

3. Que se passe-t-il si vous n'appelez pas la méthode remove() pour une variable ThreadLocal dans des threads de longue durée ?

question mark

Quel est le principal problème que l'utilisation de ThreadLocal permet de résoudre ?

Select the correct answer

question mark

Quelle est la valeur initiale d'une variable ThreadLocal lorsqu'elle est créée avec la méthode withInitial() ?

Select the correct answer

question mark

Que se passe-t-il si vous n'appelez pas la méthode remove() pour une variable ThreadLocal dans des threads de longue durée ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 4
some-alt