Java puhul on teised põhilised muutujad aatomlikud, välja arvatud 8-baidised, 64-bitised muutujad Long ja Double.
Java salvestusmudel nõuab, et nii hankimis- kui salvestustoimingud oleksid aatomilised, kuid mittevolatiilsete pika ja kahekordse muutuja puhul võimaldab JVM jagada 64-bitise lugemis- või kirjutamisprotsessi kaheks 32-bitiseks operatsiooniks.
Kui lugemis- ja kirjutamisprotsess toimub erinevatel lõimedel, võib mittevolatiilse pika tüübi lugemine anda ühe väärtuse kõrge 32 bitti ja teise väärtuse madala 32 bitti.
Seega, isegi kui aegunud andmed ei hooli sind, ei pruugi olla ohutu kasutada jagatud, muutuvaid pikki ja topeltmuutujaid mitmelõimelises programmis, välja arvatud juhul, kui need on kuulutatud volatiilseteks või kaitstud lukuga.
Rääkides aatomioperatsioonidest, tähendab see, et lugemine ja kirjutamine on aatomilised, näiteks i=5; See on aatomioperatsioon.
Kui aga kahe aatomi operatsioon toimub koos, ei ole see tingimata aatomiline, näiteks lugemine esmalt ja siis kirjutamine, siis on võimalik, et muutujat on pärast lugemist muudetud.
i++ on selline tehe, mida esmalt loetakse ja siis kirjutatakse, seega on täisarvumuutuja aatomiline, mitte et i++ oleks aatomiline operatsioon.
Kui kasutad for(int i=0; i<10000; i++){System.out.print(i)}
Sa avastad, et ma ei trükki lõpuks 10 000, vaid umbes 8-9 tuhat.
Kuid mitme lõimelise puhul, isegi kui täisarv on aatomiline, võib tekkida lõimede ohutusprobleeme, mis on lõime nähtavuse probleem, seega tuleb lisada volatiilne väide.
See modifikaator on sundmuutuja, mida loetakse iga kord mälust ja mida ei salvestata registritesse. |