थ्रेडिंग पर एक उच्च स्तरीय जावा वर्ग में मेरे शिक्षक ने कुछ ऐसा कहा जो मुझे यकीन नहीं था।
उन्होंने कहा कि निम्नलिखित कोड आवश्यक रूप से अद्यतन नहीं करेगा ready
चर को । उनके अनुसार, दो धागे जरूरी स्थिर चर को साझा नहीं करते हैं, विशेष रूप से उस स्थिति में जब प्रत्येक थ्रेड (मुख्य धागा बनाम ReaderThread
) अपने स्वयं के प्रोसेसर पर चल रहा है और इसलिए एक ही रजिस्टर / कैश / आदि और एक सीपीयू को साझा नहीं करता है। दूसरे को अपडेट नहीं करेंगे।
अनिवार्य रूप से, उन्होंने कहा कि यह संभव है ready
मुख्य धागे में अपडेट किया गया है, लेकिन अंदर नहीं है ReaderThread
, ताकि ReaderThread
असीम रूप से लूप हो जाए ।
उन्होंने यह भी दावा किया कि कार्यक्रम को प्रिंट करना 0
या करना संभव था 42
। मैं समझता हूं कैसे42
मुद्रित किया जा सकता है, लेकिन नहीं 0
। उन्होंने उल्लेख किया कि यह तब होगा जब number
चर डिफ़ॉल्ट मान पर सेट हो।
मुझे लगा कि शायद इसकी गारंटी नहीं है कि थ्रेड्स के बीच स्टेटिक वैरिएबल अपडेट किया गया है, लेकिन यह मुझे जावा के लिए बहुत ही अजीब लगता है। बनाता हैready
अस्थिर इस समस्या को सही है?
उसने यह कोड दिखाया:
public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while (!ready) Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args) {
new ReaderThread().start();
number = 42;
ready = true;
}
}