मुझे पता है कि यौगिक ऑपरेशन जैसे i++
थ्रेड सुरक्षित नहीं हैं क्योंकि वे कई ऑपरेशन शामिल करते हैं ।
लेकिन अपने आप को एक थ्रेड सुरक्षित संचालन के साथ संदर्भ की जांच कर रहा है?
a != a //is this thread-safe
मैंने इसे प्रोग्राम करने और कई थ्रेड्स का उपयोग करने की कोशिश की लेकिन यह विफल नहीं हुआ। मुझे लगता है कि मैं अपनी मशीन पर दौड़ का अनुकरण नहीं कर सकता।
संपादित करें:
public class TestThreadSafety {
private Object a = new Object();
public static void main(String[] args) {
final TestThreadSafety instance = new TestThreadSafety();
Thread testingReferenceThread = new Thread(new Runnable() {
@Override
public void run() {
long countOfIterations = 0L;
while(true){
boolean flag = instance.a != instance.a;
if(flag)
System.out.println(countOfIterations + ":" + flag);
countOfIterations++;
}
}
});
Thread updatingReferenceThread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
instance.a = new Object();
}
}
});
testingReferenceThread.start();
updatingReferenceThread.start();
}
}
यह प्रोग्राम है जो मैं थ्रेड-सुरक्षा का परीक्षण करने के लिए उपयोग कर रहा हूं।
अजीब व्यवहार
जैसा कि मेरा कार्यक्रम कुछ पुनरावृत्तियों के बीच शुरू होता है, मुझे आउटपुट फ़्लैग मूल्य मिलता है, जिसका अर्थ है कि संदर्भ !=
चेक उसी संदर्भ पर विफल रहता है। लेकिन कुछ पुनरावृत्तियों के बाद आउटपुट निरंतर मूल्य बन जाता है false
और फिर लंबे समय तक प्रोग्राम को निष्पादित करने से एक भी true
आउटपुट उत्पन्न नहीं होता है ।
जैसा कि आउटपुट कुछ n (निश्चित नहीं) पुनरावृत्तियों के बाद सुझाव देता है कि आउटपुट निरंतर मूल्य प्रतीत होता है और परिवर्तित नहीं होता है।
आउटपुट:
कुछ पुनरावृत्तियों के लिए:
1494:true
1495:true
1496:true
19970:true
19972:true
19974:true
//after this there is not a single instance when the condition becomes true
1234:true
कभी भी एक-दूसरे को नष्ट नहीं करती हैं )। एक दौड़ परीक्षा में एक सख्त आंतरिक लूप की आवश्यकता होती है। अंत में एक सारांश प्रिंट करें (जैसा कि किसी ने एक इकाई परीक्षण ढांचे के साथ नीचे किया था)।