मुझे हाल ही में अस्थिर कीवर्ड के इस अजीब व्यवहार का अनुभव हुआ है। जहाँ तक मुझे पता है,क्यों अस्थिर अजीब व्यवहार कर रहा है
अस्थिर कीवर्ड परिवर्तन अन्य धागा पर एक धागा द्वारा चर के डेटा पर किया प्रतिबिंबित करने के लिए चर के लिए पर लागू किया जाता है।
अस्थिर कीवर्ड धागे पर डेटा के कैशिंग को रोकता है।
मैं एक छोटे से परीक्षण ........
मैं एक पूर्णांक चर गिनती नामित इस्तेमाल किया था, और उस पर अस्थिर कीवर्ड का इस्तेमाल किया।
फिर 10000 के लिए चर मूल्य बढ़ाने के लिए 2 अलग धागे बनाया है, तो अंत परिणामी 20000.
होना चाहिए लेकिन ऐसा नहीं thats हमेशा की तरह, मैं अस्थिर कीवर्ड के साथ 20000 लगातार नहीं मिल रहा हो रही है, लेकिन 18,534, 15000, आदि .... और कभी कभी 20000.
लेकिन जब मैं कीवर्ड सिंक्रनाइज़ करते थे, तब भी वह अच्छे काम किया, क्यों .... ??
क्या कोई मुझे अस्थिर कीवर्ड के इस व्यवहार को समझा सकता है।
मैं अपने कोड को अस्थिर कीवर्ड के साथ-साथ सिंक्रनाइज़ किए गए कीवर्ड के साथ पोस्ट कर रहा हूं।
निम्नलिखित कोड नीचे चर गिनती पर अस्थिर कीवर्ड के साथ असंगत व्यवहार करती है
public class SynVsVol implements Runnable{
volatile int count = 0;
public void go(){
for (int i=0 ; i<10000 ; i++){
count = count + 1;
}
}
@Override
public void run() {
go();
}
public static void main(String[] args){
SynVsVol s = new SynVsVol();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Total Count Value: "+s.count);
}
}
निम्नलिखित कोड विधि चलते-फिरते सिंक्रनाइज़ कीवर्ड के साथ पूरी तरह बर्ताव करता है()।
public class SynVsVol implements Runnable{
int count = 0;
public synchronized void go(){
for (int i=0 ; i<10000 ; i++){
count = count + 1;
}
}
@Override
public void run() {
go();
}
public static void main(String[] args){
SynVsVol s = new SynVsVol();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Total Count Value: "+s.count);
}
}
हमम दिलचस्प! +1। – GETah
संभावित डुप्लिकेट [फ़ील्ड रीड और अस्थिरता के सिंक्रनाइज़ेशन के बीच अंतर] (http://stackoverflow.com/questions/3103204/difference-between-synchronization-of-field-reads-and-volatile) – Mat
कल्पना करें कि एक थ्रेड स्विच हो गया है 'गिनती = गिनती + 1' निर्देश के दौरान - खासकर जब यह 'गिनती' उठाता है और इससे पहले कि यह 'गिनती + 1' स्टोर करता है। आपको यह देखने की ज़रूरत है कि यह कुछ हज़ार बार हो रहा है और आप कर चुके हैं। इसे ठीक करने के लिए 'AtomicInteger' का उपयोग करें। – OldCurmudgeon