परिचय
volatile कीवर्ड कंपाइलर और JIT को बताता है कि फ़ील्ड को अन्य थ्रेड्स द्वारा अप्रत्याशित रूप से संशोधित किया जा सकता है। यह कैशिंग और रीऑर्डरिंग ऑप्टिमाइज़ेशन को अक्षम करता है, ताकि हमेशा नवीनतम मान पढ़ा/लिखा जाए।
उदाहरण: फील्ड पर volatile
using System;
using System.Threading;
class Program
{
// volatile: हर रीड/राइट मुख्य मेमोरी से
public volatile bool _shouldStop = false;
public string _message = "";
public void Worker()
{
while (!_shouldStop) { /* व्यस्त प्रतीक्षा */ }
Console.WriteLine(_message);
}
static void Main()
{
Program p = new Program();
Thread workerThread = new Thread(p.Worker);
workerThread.Start();
Thread.Sleep(100);
p._message = "Hello from main!";
p._shouldStop = true; // volatile के बिना, वर्कर इसे देख नहीं पा सकता (कैश्ड)
workerThread.Join();
Console.WriteLine("Done.");
}
}
मुख्य बिंदु
- केवल फ़ील्ड्स पर लागू (प्रॉपर्टी, लोकल वेरिएबल पर नहीं)।
- रेफरेंस टाइप्स के लिए: रेफरेंस volatile है, ऑब्जेक्ट सामग्री नहीं।
- आधुनिक कोड में
volatileकम उपयोग होता है;lock,Interlocked,CancellationToken,Taskप्राथमिकता दें। volatileमेमोरी बैरियर उत्पन्न करता है (acquire/release सेमेंटिक्स)।
सावधानी
volatile सभी थ्रेडिंग समस्याओं को हल नहीं करता (एटॉमिसिटी, रेस कंडीशन)। जटिल सिंक्रनाइज़ेशन के लिए lock या उच्च-स्तरीय प्राइमिटिव्स उपयोग करें।