I Java är de andra grundläggande variablerna atomära, förutom de 8-bytes, 64-bitars variablerna Long och Double.
Java-lagringsmodellen kräver att både hämta- och lagringsoperationer är atomära, men för icke-flyktiga långa och dubbla variabler tillåter JVM att dela upp en 64-bitars läs- eller skrivoperation i två 32-bitars operationer.
Om läsning och skrivning sker på olika trådar kan läsning av en icke-flyktig typ long resultera i höga 32 bitar av ett värde och låga 32 bitar av det andra.
Så även om du inte bryr dig om utgången data kan det vara osäkert att använda delade, muterbara långa och dubbla variabler i ett multitrådat program om de inte är deklarerade flyktiga eller skyddade med lås.
När vi talar om atomära operationer betyder det att läsning och skrivning är atomära, såsom i=5; Detta är en atomoperation.
Om dock två atomer utförs samtidigt, är den inte nödvändigtvis atomär, som att först läsa och sedan skriva, då är det möjligt att variabeln har modifierats efter läsning.
i++ är en sådan operation, läs först och skriv sedan, så heltalsvariabeln är atomär, inte att i++ är en atomär operation.
När du använder för(int i=0; i<10000; i++){System.out.print(i)}
Du kommer att märka att jag inte kommer att trycka 10 000 i slutändan, utan trycker ungefär 8–9 tusen.
Men i fallet med multitrådning, även om heltalsvariabeln är atomär, kan det finnas trådsäkerhetsproblem, vilket är ett trådsynlighetsproblem, så du behöver lägga till ett flyktigt sätt.
Denna modifierare är en tvingad variabel som läses från minnet varje gång och inte lagras i register. |