Multithreading mots-clés -volatile et ThreadLocal mot-clé volatile et détaillée ThreadLocal

mot-clé volatile et ThreadLocal

1, les trois concepts de programmation simultanés

Atomicité: une ou plusieurs opérations. Soit toute l'exécution et l'achèvement du processus de mise en œuvre ne sera pas interrompu ou non effectué. L'exemple le plus commun: i opération ++ / je--. Non opérations atomiques, si vous ne faites pas la synchronisation des threads susceptibles de causer des problèmes de sécurité.

Visibilité: plusieurs threads accèdent à la même variable, un fil a changé la valeur de cette variable, les autres threads peuvent voir la valeur change immédiatement. La visibilité de la question, il y a deux façons de garantir. Tout d'abord, le mot-clé volatile, le second est synchronisé et par verrouillage. Détails plus tard.

Commande: la séquence d'exécution du programme exécuté dans le code de commande.

Pour comprendre la nécessité de connaître réordonnancement d'instructions de commande. Afin d'assurer l'efficacité de fonctionnement du processeur, l'optimisation de code ne garantit pas l'ordre d'exécution de chaque instruction, mais assurera la mise en œuvre des résultats de la mise en œuvre du code est conforme à l'ordre, il ne modifie pas les résultats d'un seul fil, mais aura une incidence sur l'exactitude des fils d'exécution simultanément. réarrangement d'instructions données considère les dépendances entre les instructions, doivent être utilisées si une commande B A la suite de l'instruction, le processeur sera effectuée pour garantir que, avant A B.

Afin d'assurer la mise en œuvre correcte des programmes concurrents, nous devons nous assurer atomicité, la visibilité et l'ordre. Tant qu'il n'y a pas une garantie, il pourrait provoquer le programme à exécuter correctement.

 2, modèle mémoire de Java

Java modèle de mémoire précise: la présence de la mémoire principale de toutes les variables, chaque thread a sa propre mémoire de travail. opération filetée de la variable doit être dans la mémoire de travail, la mémoire principale et ne peut pas fonctionner directement. Et chaque fil ne peut pas accéder à la mémoire de travail d'autres threads.

Atomicité, la visibilité et assurer orderliness du langage Java lui-même fournit:

Atomicité : java, pour la variable de référence, et la plupart des types de lecture de données d' origine (sauf pour les longues et doubles) opérations sont atomiques. Ces opérations ne peuvent pas être interrompus, soit exécutées ou non. Pour toutes les variables de lecture et d' écriture déclarées comme volatile, ils sont des atomes ( à l' exception de long et double)

Visibilité : java fournit le mot - clé volatile pour assurer la visibilité.

Commande : modèle de mémoire Java, il permet aux instructions du compilateur et processeur à réorganisés. Il aura une incidence sur la précision de l' exécution simultanée de plusieurs threads. Dans le java peut être assurée en commandant le mot - clé volatile, ainsi que synchronisé et verrouillage. synchronisée et de verrouillage pour faire en sorte que chaque fois qu'un code de synchronisation fil d' exécution, ce qui rend le code de synchronisation effectue la sérialisation de fil, afin d' assurer le bon ordre. Comment expliquer plus tard garantie volatile.

 3, mot-clé volatile détaillée

Une variable partagée (variables membres de classe, une variable de membre de classe statique) modifiée après avoir été volatil, il a deux sémantique: pour assurer la visibilité et interdit la commande de réordonnancement quand un fil différent de la variable de fonctionnement.

java fournit le mot-clé volatile pour assurer la visibilité:

Lorsqu'une variable partagée est déclarée volatile, il veillera à ce que les valeurs modifiées sont immédiatement mises à jour à la mémoire principale. La nouvelle valeur sera lue dans la mémoire alors que d' autres threads lus. les variables d'actions ordinaires ne peuvent pas garantir la visibilité, il est écrit à la synchronisation de la mémoire incertaine. Lors de la lecture d' autres threads peuvent lire la valeur ancienne. 
De plus synchronisé par verrouillage et la visibilité peut être assurée. Ils peuvent faire en sorte que seul thread acquiert le verrou et le code Synchronize. Et avant la sortie des variables Modify verrouillage rincées à vivre dans la mémoire. Afin d'assurer la visibilité.
volatils principes et mécanismes de mise en œuvre clés:
Lorsque vous ajoutez le mot-clé volatile, il sera plus d'un mode de préfixe de verrouillage. verrouiller des instructions de préfixe correspondant à une barrière de mémoire qui fournit trois fonctions.
  1, il sera forcé de modifier le fonctionnement du cache immédiatement écrit à la mémoire principale.
  2, si elle est une opération d'écriture, il annule l'autre CPU dans la ligne de cache correspondante
  3, il ne sera pas acheminé vers sa position arrière avant que la barrière de la mémoire d'instructions pour veiller à ce que la remise en ordre spécifié, l'instruction précédente ne sera pas acheminé derrière la barrière de mémoire. À savoir, lors de l'exécution de la phrase de commande de barrière de mémoire, fonctionnant en face de celui-ci est terminée.

Notez que: peut volatile ne garantit pas que toutes les opérations sur les variables sont atomiques.

Vous devez avoir deux conditions pour l'utilisation du mot-clé volatile:

  1, écrire à la variable ne dépend pas de la valeur actuelle.

  2, la variable ne figure pas dans l'invariant avec d'autres variables.

4, ThreadLocal détaillée

ThreadLocal, les variables locales de thread peut également être appelé fil de stockage local. Il conserve une copie distincte de la variable pour chaque fil. La gamme visible est limitée à des objets dans le même fil.

ThreadLoca classe offre plusieurs méthodes communes:

publique T get () {} --- obtenir une copie des variables ThreadLocal stockées dans le thread courant
ensemble public void (valeur T) {} --- copie de l'ensemble actuel de fil variables
supprimer public void () {} --- supprimer la copie actuelle du fil de variable
T initialValue protégé () {} --- méthode modifiée protégée. ThreadLocal ne fournit qu'une copie peu profonde, si la variable est un type de référence, nous devons réécrire cette fonction pour obtenir une copie en profondeur. Il est recommandé lors de l'utilisation démarrage ThreadLocal réécriture de la fonction

l'action ThreadLocal: la réalisation de la variable locale dans le cadre du fil, à savoir un fil en ThreadLocal est partagée entre les différents fils sont isolés.

Principe ThreadLocal: utilisation ThreadLocal valeur stockée de l'instance actuelle ThreadLocal comme la clé, stockée dans l'objet thread courant carte go. Avant de commencer à voir le code source, je pense que c'est l'objet thread courant que la clé sera déposée dans l'objet ThreadLocal à la carte.

Je suppose que tu aimes

Origine www.cnblogs.com/alex-xyl/p/12462381.html
conseillé
Classement