Javassa muut perusmuuttujat ovat atomisia, lukuun ottamatta Longin ja Doublen 8-tavuisia, 64-bittisiä muuttujia.
Java-tallennusmalli vaatii, että sekä hankimis- että tallennusoperaatiot ovat atomisia, mutta ei-haihtuville pitkille ja kaksoismuuttujille JVM mahdollistaa 64-bittisen luku- tai kirjoitustoiminnon jakamisen kahteen 32-bittiseen operaatioon.
Jos luku- ja kirjoitusprosessi tapahtuu eri säikeissä, ei-haihtuvan tyypin pitkän lukeminen voi johtaa korkeaan 32 bittiin toisessa arvossa ja matalaan 32 bittiin toisessa.
Joten vaikka et välittäisi vanhentuneista tiedoista, monisäikeisessä ohjelmassa ei välttämättä ole turvallista käyttää jaettuja, muokattavia pitkiä ja kaksoismuuttujia, ellei niitä ole julistettu volatiileiksi tai suojattu lukolla.
Puhuttaessa atomisista operaatioista, se tarkoittaa, että lukeminen ja kirjoittaminen ovat atomisia, kuten i=5; Tämä on atomioperaatio.
Kuitenkin, jos kahden atomin toiminta tehdään yhdessä, se ei välttämättä ole atominen, kuten ensin lukeminen ja sitten kirjoittaminen, jolloin muuttujaa on muokattu lukemisen jälkeen.
i++ on tällainen operaatio, ensin luetaan ja sitten kirjoitetaan, joten kokonaislukumuuttuja on atominen, ei että i++ olisi atominen operaatio.
Kun käytät for(int i=0; i<10000; i++){System.out.print(i)}
Huomaat, etten lopulta julkaise 10 000, vaan noin 8–9 tuhatta.
Mutta monisäikeisyyden tapauksessa, vaikka kokonaislukumuuttuja olisi atominen, saattaa esiintyä säikeiden turvallisuusongelmia, mikä on säikeen näkyvyysongelma, joten sinun täytyy lisätä volatiili-lause.
Tämä modifikaattori on pakotettu muuttuja, joka luetaan muistista joka kerta eikä sitä tallenneta rekistereihin. |