Quel est le rôle de volatile en Java
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

TestThepdfinanotherApptodetermineIftheissueiswiththefileoredge.2.EnBlEthebuilt-inpdfViewerByTurningOff "AlwaysOpenpdffilesexternal" et "DownloadPdffiles" inedgestoSolver.

Importjava.ioandjava.net.socketfori / oandsocketcommunication.2.CreateasockingObjectToConnectTotheServerusingHostNAMEAndport.3.USEPRINTWRERTOSENDDATAVIATPUTSTREMANDBUFFERDREDERTOREADSERVERSPONSESESES

Application Java conteneurisée: Créez un DockerFile, utilisez une image de base telle que Eclipse-Temurin: 17-Jre-Alpine, copiez le fichier JAR et définissez la commande de démarrage, construisez l'image via DockerBuild et exécutez localement avec Dockerrun. 2. Poussez l'image vers le registre des conteneurs: utilisez Docktag pour marquer l'image et le pousser vers DockerHub et d'autres registres. Vous devez d'abord vous connecter à Dockerlogin. 3. Déploiement sur Kubernetes: écrivez Deployment.yaml pour définir le déploiement, définissez le nombre de répliques, les images de conteneurs et les restrictions de ressources, et écrivez Service.yaml pour créer

Dans VSCODE, vous pouvez rapidement changer le panneau et la zone d'édition via des touches de raccourci. Pour sauter vers le panneau d'explorateur gauche, utilisez Ctrl Shift E (Windows / Linux) ou CMD Shift E (Mac); Retournez dans la zone d'édition pour utiliser Ctrl `ou ESC ou Ctrl 1 ~ 9. Par rapport au fonctionnement de la souris, les raccourcis clavier sont plus efficaces et n'interrompent pas le rythme de codage. Les autres conseils incluent: Ctrl KCTRL E FOCUS RECHERCH BOX, F2 Renommer Fichier, Supprimer le fichier, Entrez le fichier ouvert, le dossier de la touche Arrow Extend / Effondrement.

RunThewindowsUpDateTroulesshooTervAyingSettings> Update & Security> TroubleshoottoAutomAticyFixComMonissues.2.ResetwindowsupDateComponentsBystoppingrelatedServices, RenamingtheSoftwaredSistributeandCatroot2folders, TherestartingTheServicestoClelele

JavaserializationConvertsanObject'sStateIntoabyTereamForSorageorTransmission, etdesializationreconstructStheObjectfromThatStream.1.ToEnableSerialization, aclassmustimplementTheSerizable Interface.2.UseObjectOutStreamToserialiseanobject, Savin

AwhileloopinjavarePeatlyExECUtesCodeaslongAstheConditioniStrue; 2.InitialiseAntrolvariableBeforeTheroop; 3.DefeTheLoopConditionususingAboolEanExpression; 4.UpdateTheControlvariableSideThelopToPrevevenInIniteLooping; 5.USEEXMELLESLILESLINIDINGNUNTINGNUMBUR

Pour utiliser efficacement Mockito pour les tests d'unité Java, vous devez d'abord ajouter des dépendances Mockito, ajouter des dépendances de mockito-core dans le projet Maven et ajouter le témoignation'org.mockito: mockito-core: 5.7.0 'au projet Gradle; Créez ensuite des objets simulés via une annotation @mock (combinée avec @ExtendWith (MockitoExtension.class)) ou MOCK (); puis utilisez quand (...). ThereTreturn (...) et d'autres méthodes pour coller le comportement de la méthode de l'objet simulé, ou vous pouvez configurer différents
