"Hej, Amigo!"

"Hej, Ellie!"

"Jeg vil gerne fortælle dig om den flygtige modifikator. Ved du, hvad det er?"

"Noget med tråde at gøre. Jeg husker det ikke præcist."

"Så lyt efter. Her er nogle tekniske detaljer til dig:"

"En computer har to typer hukommelse: global (almindelig) hukommelse og hukommelse indbygget i processoren. Den indbyggede processorhukommelse er opdelt i registre, en cache på første niveau (L1), cache på andet niveau (L2) og tredje niveau (L3)."

"Disse typer hukommelse har forskellige hastigheder. Den hurtigste og mindste hukommelse er registrene, derefter processorcachen (L1, L2, L3) og til sidst den globale hukommelse (den langsomste)."

"Global hukommelse og processorcachen opererer med vildt forskellige hastigheder, så Java-maskinen tillader hver tråd at gemme de hyppigst anvendte variable i lokal trådhukommelse (i processorcachen)."

"Kan denne proces på en eller anden måde kontrolleres?"

"Ikke rigtig. Alt arbejdet udføres af Java-maskinen. Den er meget intelligent, når det kommer til at optimere ydeevnen."

"Men det er derfor, jeg fortæller dig dette. Der er et lille problem. Når to tråde arbejder med den samme variabel, kan hver enkelt gemme en kopi i sin egen lokale cache. Og så kan den ene tråd ændre variablen, men den anden kan muligvis ikke se ændringen, fordi den stadig arbejder med sin egen kopi af variablen."

"Jamen, hvad kan man så gøre?"

"Javas skabere har givet et særligt nøgleord til denne situation: flygtig. Hvis en variabel tilgås fra forskellige tråde, skal du markere den med den flygtige modifikator, så Java-maskinen ikke lægger den i cachen. Sådan plejer det at være. udseende:"

public volatile int count = 0;

"Åh, jeg kan huske det. Du nævnte det allerede. Jeg ved det allerede."

"Selvfølgelig gør du det. Men du huskede det først, da jeg fortalte dig det."

"Øh, nå, jeg har glemt lidt."

"Gentagelse er læringens moder!"

"Her er et par nye fakta om den flygtige modifikator. Den flygtige modifikator garanterer kun, at variablen bliver læst og skrevet sikkert. Den garanterer ikke, at den vil blive ændret sikkert."

"Hvad er forskellen?"

"Se, hvordan en variabel ændres:"

Kode Hvad sker der virkelig: Beskrivelse
count++
register = count;

register = register+1;

count = register;
Trin 1.
Den variable tællings værdi kopieres fra den globale hukommelse til et processorregister.

Trin 2.
Inde i processoren øges registervariablen med 1.

Trin 3.
Værdien af ​​variablen kopieres fra processoren til den globale hukommelse.

"Wow! Så alle variabler ændres kun i processoren?"

"Ja."

"Og værdierne kopieres frem og tilbage: fra hukommelsen til processoren og tilbage?"

"Ja."

"Den flygtige modifikator garanterer, at når den variable tælling er tilgået, vil den blive læst fra hukommelsen (trin 1). Og hvis en tråd ønsker at tildele en ny værdi, vil den helt sikkert være i den globale hukommelse (trin 3)."

"Men Java-maskinen garanterer ikke, at der ikke vil være nogen tråd, der skifter mellem trin 1 og 3."

"Så, at øge variablen med 1 er faktisk tre operationer?"

"Ja."

"Og hvis to tråde samtidig ønsker at udføre count++, så kan de forstyrre hinanden?"

"Ja, tjek det ud:"

Tråd 1 Tråd 2 Resultat
register1 = count;
register1++;
count = register1;
register2 = count;
register2++;
count = register2;
register1 = count;
register2 = count;
register2++;
count = register2;
register1++;
count = register1;

"Så du kan få adgang til variablen, men det er stadig risikabelt at ændre den?"

"Nå, du kan ændre det, bare vær forsigtig ☺"

"Hvordan?"

" synkroniseret  er vores bedste ven."

"Jeg ser."