Sobes.tech
Junior — Middle

Ako chýba použitie kľúčového slova volatile, ako to ovplyvní správanie vlákna pri práci s objektom?

sobes.tech AI

Odpoveď od AI

Ak ne použijete kľúčové slovo volatile pre premennú, ktorú používajú viaceré vlákna, môžu zmeny tejto premennej v jednom vlákne nie byť viditeľné pre ostatné vlákna kvôli cache a optimalizáciám kompilátora. To môže viesť k tomu, že vlákno bude pracovať so zastaranou hodnotou premennej, čo spôsobí problémy so synchronizáciou a nepredvídateľné správanie programu.

Kľúčové slovo volatile zabezpečuje, že čítanie a zápis premennej budú prebiehať priamo z hlavnej pamäti, nie z lokálnej cache vlákna, čím sa zabezpečí viditeľnosť zmien medzi vláknami.

Príklad:

class SharedData {
    // Bez volatile
    boolean flag = false;

    void writer() {
        flag = true; // zmena nemusí byť okamžite viditeľná iným vláknam
    }

    void reader() {
        while (!flag) {
            // môže sa zacykliť, ak flag nebude aktualizovaný kvôli absencii volatile
        }
        // pokračovať v práci
    }
}

Ak deklarujete flag ako volatile boolean flag = false;, zmeny budú okamžite viditeľné všetkým vláknam.