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.