web-dev-qa-db-fra.com

Threadsafe vs Synchronisé

Je suis nouveau dans Java. Je suis un peu confus entre Threadsafe et synchronized. Thread safe signifie qu'une méthode ou une instance de classe peut être utilisée par plusieurs threads simultanément sans aucun problème. se produisant. Où Synchronisé signifie qu'un seul thread peut fonctionner à la fois.

Alors, comment sont-ils liés les uns aux autres?

18
Nayak

La définition de la sécurité des threads donnée dans Java Concurrency in Practice est:

Une classe est sécurisée pour les threads si elle se comporte correctement lorsqu'elle est accédée à partir de plusieurs threads, indépendamment de la planification ou de l'entrelacement de l'exécution de ces threads par l'environnement d'exécution et sans synchronisation ou autre coordination de la part du code appelant.

Par exemple, un objet Java.text.SimpleDateFormat a un état interne modifiable qui est modifié lorsqu'une méthode qui analyse ou formate est appelée. Si plusieurs threads appellent les méthodes du même objet dateformat, il est possible qu'un thread puisse modifier l'état requis par les autres threads, avec le résultat que les résultats obtenus par certains des threads peuvent être erronés. La possibilité que l'état interne soit corrompu provoquant une sortie incorrecte rend cette classe non threadsafe.

Il y a plusieurs façons de gérer ce problème. Chaque emplacement de votre application nécessitant un objet SimpleDateFormat en instancie un nouveau chaque fois que vous en avez besoin, vous pouvez créer un ThreadLocal contenant un objet SimpleDateFormat afin que chaque thread de votre programme puisse accéder à sa propre copie (chaque thread n'a donc pour en créer un), vous pouvez utiliser une alternative à SimpleDateFormat qui ne conserve pas cet état, ou vous pouvez verrouiller à l'aide de synchronized afin qu'un seul thread à la fois puisse accéder à l'objet dateFormat. Le verrouillage n’est pas nécessairement la meilleure approche. Il est préférable, dans la mesure du possible, d’éviter un état mutable partagé.

Le mot clé synchronized est un moyen de restreindre l'accès à une méthode ou à un bloc de code afin d'éviter que les données non sécurisées par un thread ne soient corrompues. Ce mot clé protège la méthode ou le bloc en imposant à un thread d’acquérir un accès exclusif à un certain verrou (l’instance d’objet, si elle est synchronisée, ou l’instance de classe, si elle est synchronisée, sur une méthode statique, ou verrouiller si vous utilisez un bloc synchronisé) avant de pouvoir entrer la méthode ou le bloc, tout en offrant une visibilité de la mémoire afin que les threads ne voient pas les données obsolètes. 

La sécurité des threads est un comportement souhaité du programme, où le bloc synchronized vous aide à obtenir ce comportement. Il existe d'autres méthodes pour obtenir la sécurité des threads, par exemple une classe/des objets immuables. J'espère que cela t'aides.

9
fastcodejava

Sécurité des threads _ : Un programme thread-safe protège ses données contre les erreurs de cohérence de la mémoire. Dans un programme hautement multithread, un programme thread-safe ne provoque aucun effet secondaire avec plusieurs opérations de lecture/écriture à partir de plusieurs threads sur des données partagées (objets). Différents threads peuvent partager et modifier les données d'objet sans erreurs de cohérence. 

synchronized est une méthode de base pour obtenir du code ThreadSafe. 

Reportez-vous aux questions SE ci-dessous pour plus de détails:

Qu'est-ce que «synchronisé» signifie?

Vous pouvez assurer la sécurité des threads en utilisant une API de concurrence avancée. Cette documentation page fournit de bonnes constructions de programmation pour assurer la sécurité des threads.

Verrouiller les objets prend en charge les idiomes de verrouillage qui simplifient de nombreuses applications simultanées.

Collections simultanées facilitent la gestion de grandes collections de données et réduisent considérablement le besoin de synchronisation.

Les variables atomiques ont des fonctionnalités qui minimisent la synchronisation et aident à éviter les erreurs de cohérence de la mémoire.

ThreadLocalRandom(dans JDK 7) permet de générer efficacement des nombres pseudo-aléatoires à partir de plusieurs threads.

Reportez-vous à Java.util.concurrent et Java.util.concurrent.atomic packages également pour d'autres constructions de programmation. 

Question SE connexe:

Synchronisation vs Lock

4
Ravindra babu

Après avoir lu patiemment beaucoup de réponses sans être trop technique en même temps, je pourrais dire quelque chose de précis mais proche de ce que Nayak avait déjà répondu à fastcodejava above, ce qui viendra plus tard dans ma réponse. mais regarde

la synchronisation n'est même pas proche de la sécurité des threads; il s'agit simplement de rendre un morceau de code (ou une méthode) sûr et incorruptible pour un seul thread autorisé, en l'empêchant d'être utilisé par d'autres threads.

La sécurité des threads concerne la façon dont tous les threads accédant à un élément donné se comportent et obtiennent les résultats souhaités de la même manière s’ils auraient été séquentiels (ou même pas), sans aucune forme de corruption non souhaitée (désolé pour la pléonasme ) comme dans un monde idéal.

L’un des moyens de parvenir à proximité du thread-safety serait d’utiliser des classes dans Java.util.concurrent.atomic .

Triste qu'ils n'aient pas final méthodes!

2
Aakash Verma

Synchronisé: un seul thread peut fonctionner à la fois. Threadsafe: une méthode ou une instance de classe peut être utilisée par plusieurs threads simultanément sans problème. Si vous associez cette question à, Pourquoi les méthodes synchronisées sont-elles thread-safe? que vous pouvez avoir une meilleure idée.

Selon la définition, cela semble être source de confusion. Mais non, si vous le comprenez de manière analytique.

Synchronisé signifie: séquentiellement un par un dans un ordre, pas concurremment [pas en même temps]. Méthode synchronisée ne permet pas d’agir sur un autre thread, tant qu’un thread fonctionne déjà dessus. Cela évite la concurrence. Exemple de synchronisation: Si vous souhaitez acheter un ticket de film et vous mettre en file d'attente. vous obtiendrez le billet seulement après que la personne devant vous le récupérera. 

Thread safe signifie que la méthode est sécurisée et que plusieurs threads peuvent y accéder sans aucun problème en même temps. Le mot clé synchronisé est l'un des moyens permettant d'atteindre le "thread safe". Mais rappelez-vous: en fait, lorsque plusieurs threads tentent d'accéder à une méthode synchronisée, ils suivent l'ordre et l'accès est sécurisé. En réalité, Même s'ils agissent en même temps, mais ne peuvent pas accéder à la même ressource (méthode/bloc) en même temps, en raison du comportement synchronisé de la ressource. 

En effet, si une méthode est synchronisée, il devient alors sûr de permettre à plusieurs threads d’agir dessus, sans aucun problème. Rappelez-vous :: plusieurs threads " ne pas agir en même temps " c'est pourquoi nous appelons les méthodes synchronisées thread safe.

J'espère que cela aide à comprendre.

0
mbagat

Nayak, lorsque nous déclarons une méthode comme étant synchronisée, tous les autres appels à cette dernière provenant d'autres threads sont verrouillés et peuvent attendre indéfiniment. Java fournit également d'autres moyens de verrouillage avec les objets verrouillés. 

Vous pouvez également déclarer un objet final ou volatil afin de garantir sa disponibilité pour les autres threads simultanés.

ref: http://www.javamex.com/tutorials/threads/thread_safety.shtml

0
killjoy

Dans la pratique, les classes de performances thread-safe, synchronisées, non-thread-safe et non-synchronisées sont classées comme suit:

Hashtable(slower)  <  Collections.SynchronizedMap  <  HashMap(fastest)
0
Joel Mata