lire quelques threads ( Problèmes communs de simultanéie , Mot-clé volatile a>, Modèle de mémoire ) Je suis confus sur les problèmes de concurrence dans Java. P>
J'ai beaucoup de champs accessibles par plus d'un fil. Dois-je les passer à travers et les marquer tous comme volatiles? P>
Lors de la construction d'une classe, je ne suis pas au courant de savoir si plusieurs threads y accéderont, il est donc dangereux de laisser n'importe quel champ Pour moi, cela est spécifique à la version 1.5 JVMS et plus loin, mais ne vous sentez pas limité à répondre à ma configuration spécifique. P>
4 Réponses :
Eh bien, vous avez lu ces autres questions et je présume que vous avez déjà lu les réponses déjà, donc je vais simplement mettre en évidence des points clés: p>
Ajouté:
Si le champ fait référence à un objet, il aura des champs de son propre et toutes ces mesures s'appliquent également à ces champs. P>
La réponse courte est non. Les problèmes de filetage nécessitent plus de pensée et de planification que cela. Voir Ceci pour certaines limitations lorsqu'une volatilité aide à enfiler et quand il ne le fait pas. La modification des valeurs doit être correctement synchronisée, mais la modification de manière très typique nécessite l'état de plus d'une variable à la fois. Dites par exemple, vous avez une variable et vous souhaitez le modifier s'il rencontre un critère. La lecture de la matrice et l'écriture sur la matrice sont des instructions différentes et doivent être synchronisées ensemble. Volatile n'est pas suffisant. P>
Considérez également le cas où la variable références d'un objet mutable (disent un tableau ou une collection), puis interagissant avec cet objet ne sera pas en sécurité simplement parce que la référence est volatile. P>
Si un champ est accessible par plusieurs threads, il devrait être Une classe doit être spécialement conçue pour un accès simultané par plusieurs threads. Il suffit de marquer des champs volatils ou finaux non suffisants pour la sécurité du fil. Il existe des problèmes de cohérence (atomicité des modifications apportées à plusieurs champs), préoccupations concernant la signalisation inter-thread (par exemple en utilisant Donc, il est le plus sûr de supposer qu'un objet doit être visible pour seulement un seul thread à moins qu'il ne soit documenté autrement. La fabrication de tous vos objets est un thread-coffre-fort n'est pas nécessaire et est coûteux en termes de vitesse logicielle, mais plus important encore, en termes de dépenses de développement. p>
Au lieu de cela, le logiciel doit être conçu de manière à ce que les threads simultanés interagissent le moins possible les uns avec les autres, de préférence pas du tout. Les points où ils interagissent doivent être clairement identifiés de manière à ce que les contrôles de concurrence appropriés puissent être conçus. P> volatile code> ou
final code> ou accessible uniquement avec des blocs synchronisés. Sinon, les valeurs attribuées peuvent ne pas être visibles pour d'autres threads. P>
attendre code> et
notify code>), etc. p>
Si vous devez demander, utilisez des serrures. si deux threads exécutent Notez que à l'aide de volatile code> peut être utile dans certains cas, mais c'est très difficile à obtenir. Par exemple:
incrément () code> en même temps, il est possible que le résultat soit
compteur = 1 code> . En effet, l'ordinateur va d'abord récupérer
compteur code>, ajoutez-en un, puis sauvegardez-le. Volatile force juste la sauvegarde et la charge pour se produire dans un ordre spécifique par rapport à d'autres déclarations. P>
synchronisé code> évite généralement le besoin de
volatile code> - si Tous les accès à un champ donné sont protégés par le même moniteur,
volatile code> ne seront jamais nécessaires. p>
volatile code> pour faire des algorithmes sans verrouillage est très, très difficile; Stick to
synchronisé code> sauf si vous avez déjà une preuve difficile, et a déjà effectué une analyse détaillée sur l'algorithme que vous envisagez de mettre en œuvre. p> p>
Pour ce cas d'utilisation particulière, voir AtomicInteger, plutôt que d'utiliser synchronisé code> vous-même.
En effet. Je voulais juste démontrer les pièges d'utiliser aveuglément en utilisant synchronisé code> sans comprendre exactement ce qu'il fait et ne fournit pas