Éléments à prendre en compte lors de l'écriture de code thread-safe :
1. Variables partagées
2. Variables mutables
Partagé signifie que plusieurs threads peuvent y accéder en même temps, et mutable signifie que sa valeur peut changer au cours de son cycle de vie.
Par exemple, la variable count suivante :
Copiez le code comme suit :
//Classe non sécurisée pour les threads
classe publique UnsafeCount {
private int count = 0; //Cette variable est partagée
public void raise() { //Il n'y a pas de mécanisme de synchronisation ici, plusieurs threads peuvent accéder en même temps
count++; //Cette variable est variable
}
public int getCount() {
nombre de retours ;
}
}
Il existe 4 façons de résoudre ce problème :
1. Au lieu de partager la variable d'état entre les threads, vous pouvez encapsuler la variable dans une méthode (les objets sans état doivent être thread-safe car les variables de la méthode sont exclusives à chaque thread et ne sont pas partagées avec d'autres threads). Par exemple:
Copiez le code comme suit :
public int ajouter (int compte) {
return ++count;//On peut aussi dire ici que les objets sans état doivent être thread-safe
}
2. Modifiez la variable d'état en variable immuable.
Copiez le code comme suit :
nombre int final privé = 0 ;
3. Utilisez la stratégie de synchronisation lors de l'accès aux variables d'état.
Copiez le code comme suit :
augmentation de vide synchronisée publique() {
compte++;
}
4. Utilisez des classes de variables atomiques.
Copiez le code comme suit :
nombre AtomicInteger privé ;
augmentation du vide public() {
compte.getAndAdd(1);
}