मैंने समवर्ती समस्याओं के बारे में कई पोस्ट पढ़ी लेकिन मुझे अभी भी कुछ के बारे में अनिश्चितता है। क्या मैं कह सकता हूं कि सिंक्रनाइज़ किए जाने पर, मुझे अस्थिर कार्यक्षमता मिलती है, क्योंकि जब किसी ऑब्जेक्ट पर लॉक जारी किया जाएगा, तो अगला थ्रेड हमेशा संशोधित ऑब्जेक्ट को पढ़ता है। अस्थिर के साथ, किसी ऑब्जेक्ट का मान तुरंत अन्य धागे पर दिखाई देता है। लेकिन जब मैं सिंक्रनाइज़ का उपयोग करता हूं, तो ऑब्जेक्ट पर लॉक के कारण तुरंत इसे प्रतिबिंबित करने की कोई संभावना नहीं होती है। जब लॉक जारी किया जाता है, तो केवल एक और थ्रेड इसे एक्सेस कर सकता है। तो मुझे तुरंत अन्य धागे के मूल्य को प्रतिबिंबित करने की परवाह नहीं है। क्या मैं यह सही समझता हूँ?जावा सिंक्रनाइज़ किए जाने पर मुझे अस्थिर कार्यक्षमता मुफ्त में मिलती है?
[अद्यतन]
उदाहरण प्रिंट हमेशा 1 2 3 4 5 6 7 8 9 अस्थिर बिना।
package main;
public class Counter
{
public static long count = 0;
}
public class UseCounter implements Runnable
{
public void increment()
{
synchronized (this)
{
Counter.count++;
System.out.print(Counter.count + " ");
}
}
@Override
public void run()
{
increment();
increment();
increment();
}
}
public class DataRace
{
public static void main(String args[])
{
UseCounter c = new UseCounter();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
Thread t3 = new Thread(c);
t1.start();
t2.start();
t3.start();
}
}
आपके अपडेट के बारे में: वर्तमान में यह वास्तव में प्रिंट करता है कुछ भी मतलब है। जब आप कम से कम उम्मीद करते हैं तो डेटा रेस की स्थिति आमतौर पर चुप रहती है और उन्हें पुन: पेश करने और हल करने में बहुत मुश्किल होती है। क्या मायने रखता है यदि आपने जावा मेमोरी मॉडल के नियमों का पालन किया है। –
ठीक है धन्यवाद। हालांकि मैं बिना अस्थिर के गलत व्यवहार को पुन: उत्पन्न नहीं कर सकता (भले ही मैं लूप में कोड 1.000.000 बार चलाता हूं), मैं इसे ध्यान में रखूंगा। – Bevor