I Java er de andre grunnleggende variablene atomære, bortsett fra de 8-byte, 64-bits variablene Long og Double.
Java-lagringsmodellen krever at både hent- og lagringsoperasjoner er atomære, men for ikke-flyktige lange og doble variabler tillater JVM å dele en 64-bits lese- eller skriveoperasjon i to 32-bits operasjoner.
Hvis lesing og skriving skjer i forskjellige tråder, kan lesing av en ikke-flyktig type long resultere i høye 32 biter av én verdi og lave 32 biter av den andre.
Så selv om du ikke bryr deg om utgåtte data, kan det hende det ikke er trygt å bruke delte, foranderlige lange og doble variabler i et multitrådet program med mindre de er erklært flyktige eller beskyttet med en lås.
Når vi snakker om atomoperasjoner, betyr det at lesing og skriving er atomære, som i=5; Dette er en atomoperasjon.
Men hvis operasjonen mellom to atomer utføres samtidig, er den ikke nødvendigvis atomær, som å lese først og deretter skrive, da er det mulig at variabelen har blitt endret etter lesing.
i++ er en slik operasjon, les først og skriv deretter, så heltallsvariabelen er atomær, ikke at i++ er en atomær operasjon.
Når du bruker for(int i=0; i<10000; i++){System.out.print(i)}
Du vil oppdage at jeg ikke trykker 10 000 til slutt, men trykker rundt 8-9 tusen.
Men i tilfelle multitråding, selv om heltallsvariabelen er atomær, kan det oppstå trådsikkerhetsproblemer, som er et trådsynlighetsproblem, så du må legge til en flyktig setning.
Denne modifikatoren er en tvungen variabel som leses fra minnet hver gang og ikke lagres i registre. |