"Hallo Amigo!"

"Hallo, Ellie!"

"Ik wil je vertellen over de vluchtige modifier. Weet je wat dat is?"

'Iets met draadjes. Ik weet het niet meer precies.'

"Luister dan goed. Hier zijn wat technische details voor je:"

"Een computer heeft twee soorten geheugen: globaal (gewoon) geheugen en geheugen ingebouwd in de processor. Het ingebouwde processorgeheugen is verdeeld in registers, een cache op het eerste niveau (L1), cache op het tweede niveau (L2) en derde niveau (L3)."

"Deze soorten geheugen hebben verschillende snelheden. Het snelste en kleinste geheugen zijn de registers, dan de processorcache (L1, L2, L3) en ten slotte het globale geheugen (de langzaamste)."

"Globaal geheugen en de processorcache werken met enorm verschillende snelheden, dus de Java-machine staat elke thread toe om de meest gebruikte variabelen op te slaan in het lokale threadgeheugen (in de processorcache)."

"Kan dit proces op de een of andere manier gecontroleerd worden?"

"Niet echt. Al het werk wordt gedaan door de Java-machine. Het is erg intelligent als het gaat om het optimaliseren van de prestaties."

"Maar hier is waarom ik je dit vertel. Er is een klein probleem. Wanneer twee threads met dezelfde variabele werken, kan elke thread een kopie opslaan in zijn eigen lokale cache. En dan kan de ene thread de variabele veranderen, maar de tweede ziet de wijziging mogelijk niet, omdat het nog steeds werkt met zijn eigen kopie van de variabele."

"Nou, wat kan er dan gedaan worden?"

"De makers van Java hebben een speciaal trefwoord voor deze situatie gebruikt: vluchtig. Als een variabele wordt benaderd vanuit verschillende threads, moet je deze markeren met de vluchtige modifier, zodat de Java-machine deze niet in de cache plaatst. Dit is hoe het gewoonlijk ziet eruit:"

public volatile int count = 0;

"Oh, dat weet ik nog. Je hebt dit al genoemd. Ik weet dit al."

'Natuurlijk. Maar je herinnerde het je pas toen ik het je vertelde.'

"Eh, nou, ik ben een beetje vergeten."

"Herhaling is de moeder van leren!"

"Hier zijn een paar nieuwe feiten over de vluchtige modifier. De vluchtige modifier garandeert alleen dat de variabele veilig zal worden gelezen en geschreven. Het garandeert niet dat deze veilig zal worden gewijzigd."

"Wat is het verschil?"

"Kijk hoe de variabele is gewijzigd:"

Code Wat gebeurt er echt: Beschrijving
count++
register = count;

register = register+1;

count = register;
Stap 1.
De waarde van de variabele count wordt gekopieerd van het globale geheugen naar een processorregister.

Stap 2.
Binnen de processor wordt de registervariabele verhoogd met 1.

Stap 3.
De waarde van de variabele wordt gekopieerd van de processor naar het globale geheugen.

"Wauw! Dus alle variabelen worden alleen in de processor gewijzigd?"

"Ja."

"En de waarden worden heen en weer gekopieerd: van het geheugen naar de processor en terug?"

"Ja."

"De vluchtige modifier garandeert dat wanneer toegang tot de variabele count wordt verkregen, deze uit het geheugen wordt gelezen (stap 1). En als een thread een nieuwe waarde wil toewijzen, zal deze zich zeker in het globale geheugen bevinden (stap 3)."

"Maar de Java-machine garandeert niet dat er tussen stap 1 en stap 3 geen thread-switching zal zijn."

"Dus het verhogen van de variabele met 1 is eigenlijk drie bewerkingen?"

"Ja."

"En als twee threads tegelijkertijd count++ willen uitvoeren, kunnen ze elkaar dan storen?"

"Ja, kijk eens:"

Draad 1 Draad 2 Resultaat
register1 = count;
register1++;
count = register1;
register2 = count;
register2++;
count = register2;
register1 = count;
register2 = count;
register2++;
count = register2;
register1++;
count = register1;

"Dus je hebt toegang tot de variabele, maar het wijzigen ervan is nog steeds riskant?"

"Nou, je kunt het veranderen, wees voorzichtig ☺"

"Hoe?"

" gesynchroniseerd  is onze beste vriend."

"Ik zie."