Maison Java JavaBase Quel est le rôle de volatile en Java

Quel est le rôle de volatile en Java

Jan 11, 2021 am 11:13 AM
java volatile

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.

Quel est le rôle de volatile en Java

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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

Guide du débutant de Rimworld: Odyssey
1 Il y a quelques mois By Jack chen
Porce de variable PHP expliquée
4 Il y a quelques semaines By 百草
Conseils pour écrire des commentaires PHP
3 Il y a quelques semaines By 百草
Commentant le code en php
3 Il y a quelques semaines By 百草

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Sujets chauds

Tutoriel PHP
1509
276
La visionneuse PDF Edge ne fonctionne pas La visionneuse PDF Edge ne fonctionne pas Aug 07, 2025 pm 04:36 PM

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

Comment implémenter un client TCP simple en Java? Comment implémenter un client TCP simple en Java? Aug 08, 2025 pm 03:56 PM

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

Déploiement d'une application Java à Kubernetes avec Docker Déploiement d'une application Java à Kubernetes avec Docker Aug 08, 2025 pm 02:45 PM

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

VS CODE Raccourci pour se concentrer sur le panneau Explorer VS CODE Raccourci pour se concentrer sur le panneau Explorer Aug 08, 2025 am 04:00 AM

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.

Correction: la mise à jour Windows n'a pas réussi à installer Correction: la mise à jour Windows n'a pas réussi à installer Aug 08, 2025 pm 04:16 PM

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

Quel est le processus de sérialisation pour un objet Java? Quel est le processus de sérialisation pour un objet Java? Aug 08, 2025 pm 04:03 PM

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

Comment utiliser une boucle de temps en Java Comment utiliser une boucle de temps en Java Aug 08, 2025 pm 04:04 PM

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

Comment utiliser Mockito pour se moquer en Java? Comment utiliser Mockito pour se moquer en Java? Aug 07, 2025 am 06:32 AM

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

See all articles