Le rôle de volatile en Java : 1. Java fournit le mot-clé volatile pour assurer la visibilité ; 2. Pour garantir l'ordre, le code est [context = loadContext(); 3. Fournir un double vérifier.
L'environnement d'exploitation de ce tutoriel : système Windows 7, version Java 10, ordinateur DELL G3 Cette méthode convient à toutes les marques d'ordinateurs.
Recommandations d'apprentissage gratuites associées : Tutoriel de base Java
Le rôle de volatile en Java :
1. Visibilité : Java fournit le mot-clé volatile pour assurer la visibilité.
Lorsqu'une variable partagée est modifiée de manière volatile, elle garantira que la valeur modifiée sera immédiatement mise à jour dans la mémoire principale. Lorsque d'autres threads auront besoin de la lire, elle lira la nouvelle valeur de la mémoire. .
Les variables partagées ordinaires ne peuvent pas garantir la visibilité, car après la modification d'une variable partagée ordinaire, il n'est pas certain quand elle sera écrite dans la mémoire principale. Lorsque d'autres threads la liront, la mémoire peut toujours être l'ancienne valeur d'origine. , la visibilité n'est donc pas garantie.
De plus, la visibilité peut également être garantie grâce à synchronisé et Lock. Synchronized et Lock peuvent garantir qu'un seul thread acquiert le verrou en même temps puis exécute le code de synchronisation, et la modification de la variable sera. vidé dans la mémoire principale avant de libérer le verrou. La visibilité est donc garantie.
Regardez d'abord un morceau de code. Si le thread 1 s'exécute en premier et que le thread 2 s'exécute plus tard :
//线程1 boolean stop = false; while(!stop){ doSomething(); } //线程2 stop = true;
Ce code est un morceau de code très typique. De nombreuses personnes peuvent l'utiliser lors de l'interruption d'un. fil. Mais au fait, ce code fonctionnera-t-il tout à fait correctement ? Autrement dit, le fil sera-t-il interrompu ? Pas nécessairement, peut-être la plupart du temps, ce code peut interrompre le thread, mais il peut également empêcher l'interruption du thread (bien que cette possibilité soit très faible, mais une fois que cela se produit, cela provoquera une boucle infinie).
Expliquons pourquoi ce code peut empêcher l'interruption du fil de discussion. Comme expliqué précédemment, chaque thread a sa propre mémoire de travail pendant son exécution, donc lorsque le thread 1 est en cours d'exécution, il copiera la valeur de la variable stop et la placera dans sa propre mémoire de travail.
Ensuite, lorsque le thread 2 change la valeur de la variable stop, mais avant d'avoir le temps de l'écrire dans la mémoire principale, le thread 2 bascule pour faire autre chose, alors le thread 1 ne connaît pas le changement du stop variable par le thread 2, donc le cycle continuera.
Mais après avoir utilisé la modification volatile, cela devient différent :
Premièrement : l'utilisation du mot-clé volatile forcera l'écriture immédiate de la valeur modifiée dans la mémoire principale
First 2 ; : Si le mot-clé volatile est utilisé, lorsque le thread 2 effectue une modification, la ligne de cache de la variable de cache stop dans la mémoire de travail du thread 1 sera invalide (si elle est reflétée dans la couche matérielle, la ligne de cache correspondante dans le L1 ou le L1 du CPU Le cache L2 sera invalide) );
Troisième : Puisque la ligne de cache de l'arrêt de la variable de cache dans la mémoire de travail du thread 1 est invalide, le thread 1 ira dans la mémoire principale pour lire la valeur de la variable arrête encore.
Ensuite, lorsque le thread 2 modifie la valeur d'arrêt (cela inclut bien sûr 2 opérations, modifier la valeur dans la mémoire de travail du thread 2, puis écrire la valeur modifiée dans la mémoire), cela entraînera la mémoire de travail du thread 1 à La ligne de cache de la variable de cache stop est invalide, puis lorsque le thread 1 la lit, il constate que sa ligne de cache est invalide. Il attendra que l'adresse mémoire principale correspondant à la ligne de cache soit mise à jour, et puis allez dans la mémoire principale correspondante pour lire la dernière valeur.
Ensuite, ce que lit le fil 1 est la dernière valeur correcte.
2. Assurez-vous de l'ordre
volatile boolean inited = false; //线程1: context = loadContext(); inited = true; //线程2: while(!inited ){ sleep() } doSomethingwithconfig(context);
Assurez-vous que le contexte a été initialisé.
3. revérifiez
class Singleton{ private volatile static Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if(instance==null) { synchronized (Singleton.class) { if(instance==null) instance = new Singleton(); } } return instance; } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!