I Java er de andre grundlæggende variable atomare, undtagen de 8-byte, 64-bit variable Long og Double.
Java-lagringsmodellen kræver, at både hent- og lagreoperationer er atomare, men for ikke-flygtige lange og dobbelte variable tillader JVM opdeling af en 64-bit læse- eller skriveoperation i to 32-bit operationer.
Hvis læsning og skrivning sker på forskellige tråde, kan læsning af en ikke-flygtig type long resultere i høje 32 bit af den ene værdi og lave 32 bit af den anden.
Så selv hvis du ikke bekymrer dig om udløbne data, kan det være usikkert at bruge delte, muterbare lange og dobbelte variable i et multitrådet program, medmindre de er erklæret flygtige eller beskyttet med en lås.
Når vi taler om atomare operationer, betyder det, at læsning og skrivning er atomar, såsom i=5; Dette er en atomoperation.
Hvis to atomer dog udføres samtidig, er det ikke nødvendigvis atomart, som først at læse og derefter skrive, så er det muligt, at variabelen er blevet ændret efter læsning.
i++ er en sådan operation, læs først og skriv derefter, så heltalsvariabelen er atomar, ikke at i++ er en atomar operation.
Når du bruger for(int i=0; i<10000; i++){System.out.print(i)}
Du vil opdage, at jeg ikke vil trykke 10.000 til sidst, men trykker omkring 8-9 tusinde.
Men i tilfælde af multi-threading, selv hvis heltalsvariablen er atomar, kan der opstå trådsikkerhedsproblemer, hvilket er et trådsynlighedsproblem, så du skal tilføje en flygtig sætning.
Denne modifikator er en tvungen variabel, der læses fra hukommelsen hver gang og ikke gemmes i registre. |