web-dev-qa-db-fra.com

Qu'est-ce que thread Safe en Java?

Duplicate possible:
Qu'est-ce que threadsafe signifie?

Je suis très confus que toute classe est thread-safe. Je comprends que, si une classe est thread-safe, alors elle a des méthodes spécifiques (synchronisées). Est-ce vrai ou faux? S'il vous plaît aidez-moi en expliquant la signification de celui-ci.

50
Anuj

Comme Seth l'a déclaré, thread safe signifie qu'une instance de méthode ou de classe peut être utilisée par plusieurs threads en même temps, sans aucun problème.

Considérez la méthode suivante:

private int myInt = 0;
public int AddOne()
{
    int tmp = myInt;
    tmp = tmp + 1;
    myInt = tmp;
    return tmp;
}

Maintenant, thread A et thread B voudraient tous les deux exécuter AddOne(). mais A commence en premier et lit la valeur de myInt (0) dans tmp. Maintenant, pour une raison quelconque, le planificateur décide d’arrêter le thread A et de reporter l’exécution sur le thread B. Le fil B lit maintenant également la valeur de myInt (toujours 0) Dans sa propre variable tmp. Thread B termine la méthode entière, donc à la fin myInt = 1. Et 1 Est renvoyé. Maintenant, c'est à nouveau Thread A. Le fil A continue. Et ajoute 1 À tmp (tmp était 0 Pour le fil A). Et enregistre ensuite cette valeur dans myInt. myInt est encore 1.

Donc, dans ce cas, la méthode AddOne() a été appelée deux fois, mais comme la méthode n'a pas été implémentée de manière thread-safe, la valeur de myInt n'est pas 2, Comme prévu. , mais 1 car le deuxième thread a lu la variable myInt avant que le premier thread ait terminé de la mettre à jour.

La création de méthodes thread-safe est très difficile dans des cas non triviaux. Et il y a pas mal de techniques. Dans Java vous pouvez marquer une méthode avec synchronized, cela signifie qu'un seul thread peut exécuter cette méthode à un moment donné. Les autres threads attendent en ligne. Cela rend une méthode thread-safe, mais s'il y a beaucoup de travail à faire dans une méthode, cela fait perdre beaucoup de temps. Une autre technique consiste à 'marquer seulement une petite partie d'une méthode. comme synchronisé ' en créant un verrou ou un sémaphore et en verrouillant cette petite partie (généralement appelée section critique). Il existe même certaines méthodes implémentées en tant que threadless safe safe, ce qui signifie qu'elles sont construit de manière à ce que plusieurs threads puissent y circuler en même temps sans causer de problèmes, ceci peut être le cas lorsqu'une méthode n'exécute qu'un seul appel atomique. Les appels atomiques sont des appels qui ne peuvent pas être interrompus et ne peuvent être effectués que par un fil à la fois.

144
Roy T.

Thread safe signifie simplement qu'il peut être utilisé à partir de plusieurs threads en même temps sans causer de problèmes. Cela peut signifier que l'accès à toutes les ressources est synchronisé, ou autre.

38
Seth Carnegie