Sobes.tech
Middle

Mis vahe on volatile ja atomaarsete muutujate vahel?

sobes.tech AI

Vastus AI-lt

volatile tagab muutujate muutuste nähtavuse erinevate voogude vahel ning keelab kompilaatoril ja JVM-il ümber korraldada selle muutujaga seotud juhiseid. See tagab, et volatile-muutujat lugedes näeb voog viimast kirjutatud väärtust. Kuid volatile ei taga koostisosade operatsioonide (näiteks inkrement) atomaarset täitmist.

java.util.concurrent.atomic paketi atomaarklassid (näiteks AtomicInteger, AtomicLong, AtomicReference) kasutavad madala taseme atomaarseid operatsioone, nagu Compare-And-Swap (CAS), mis teostatakse riistvara tasemel. Need tagavad lugemise-muutmise-kirjutamise operatsioonide atomaarse täitmise ilma synchronized-i kasutamata:

Võrdlus:

Omadus volatile Atomaarne muutuja (AtomicInteger jms)
Atomaarsus Ei taga koostisosade operatsioonide atomaarset täitmist. Tagab operatsioonide atomaarse täitmise (CAS).
Nähtavus Tagab muudatuste nähtavuse teistele voogudele. Tagab nähtavuse (CAS-i kõrvalmõju).
Kasutus Lihtne lugemine/kirjutamine nähtavuse tagamiseks. Atomaarsete operatsioonide jaoks, nt. inkrement, CAS.
Kulud Vähem kui synchronized. Tavaliselt väiksemad kui synchronized, madala konkurentsiga tingimustes.

volatile näide:

class SharedData {
    volatile boolean flag = false; // Muutuse nähtavus

    public void setFlag() {
        flag = true;
    }

    public boolean isFlag() {
        return flag;
    }
}

AtomicInteger näide:

import java.util.concurrent.atomic.AtomicInteger;

class Counter {
    AtomicInteger count = new AtomicInteger(0); // Atomaarne loendur

    public void increment() {
        count.incrementAndGet(); // Atomaarne inkrement
    }

    public int getCount() {
        return count.get();
    }
}