जब मल्टीथ्रेडिंग की अवधारणा को लागू किया जाता है, तो यह संभव है कि एक थ्रेड द्वारा किए गए परिवर्तन दूसरे थ्रेड को दिखाई न दें। यह इंगित करता है कि प्रत्येक धागे का दृश्य एक दूसरे के संबंध में असंगत है। इसे मेमोरी कंसिस्टेंसी एरर के रूप में जाना जाता है।
सीपीयू एक अलग क्रम में मुख्य मेमोरी एक्सेस शुरू कर सकता है, जबकि थ्रेड्स उन्हें एक अलग क्रम में एक्सेस कर सकते हैं।
यह आमतौर पर तब सच होता है जब लेखन कार्य किया जा रहा हो, जिससे CPU प्रतीक्षा समय से बचा जा सके।
राइट ऑपरेशन एक परमाणु है, जिसका अर्थ है कि जब कोई राइट ऑपरेशन किया जा रहा हो तो अन्य थ्रेड्स द्वारा कोई अन्य ऑपरेशन नहीं किया जाएगा।
इसके अलावा, प्रत्येक संबद्ध सीपीयू के लिए लिखने के संचालन का क्रम लगातार बनाए रखा जाएगा, जबकि सीपीयू अन्य सीपीयू के लेखन समय को अलग तरीके से समझ सकते हैं। इस घटना से स्मृति असंगति हो सकती है।
स्मृति असंगतता त्रुटियों से कैसे बचा जा सकता है?
होने से पहले के संबंध को स्थापित करने की आवश्यकता है ताकि स्मृति लेखन एकल धागे द्वारा किया जाता है, और यह उसी स्मृति पर अन्य धागे द्वारा किए गए कार्यों को पढ़ने के लिए दृश्यमान है।
'स्टार्ट' फंक्शन और 'जॉइन' फंक्शन को संबंध होने से पहले माना जाता है। 'स्टार्ट' फ़ंक्शन यह सुनिश्चित करता है कि नव निर्मित धागा दिखाई दे रहा है। 'जॉइन' फ़ंक्शन यह सुनिश्चित करता है कि जो थ्रेड दिखाई दे रहा है वह दूसरे थ्रेड से जुड़ गया है।
उदाहरण
import java.io.*; class class_shared{ static int m=2; void inc(){ for(int j=0;j<5;j++){ m = m+1; System.out.println("After its increment is "+m); } } void dec(){ for(int j=0;j<5;j++){ m = m-1; System.out.println("After its decrement is "+m); } } } public class Demo{ public static void main(String[] args){ final class_shared my_inst = new class_shared(); Thread my_t_1 = new Thread(){ @Override public void run(){ my_inst.inc(); } }; Thread my_t_2 = new Thread(){ @Override public void run(){ my_inst.dec(); } }; my_t_1.start(); my_t_2.start(); } }
आउटपुट
After its increment is 3 After its decrement is 2 After its decrement is 2 After its decrement is 1 After its increment is 3 After its decrement is 0 After its increment is 1 After its increment is 1 After its decrement is 0 After its increment is 2
'class_shared' नामक एक वर्ग एक स्थिर मान और एक शून्य फ़ंक्शन को परिभाषित करता है, जो संख्याओं के एक सेट पर पुनरावृति करता है, और इसे बढ़ाता है और इसे कंसोल पर प्रदर्शित करता है। 'dec' नाम का एक अन्य फ़ंक्शन हर बार संख्याओं और कमी के एक सेट पर पुनरावृति करता है और कंसोल पर आउटपुट प्रदर्शित करता है। एक क्लासनाम डेमो में मुख्य कार्य होता है जो कक्षा का एक उदाहरण बनाता है, और एक नया थ्रेड बनाता है। यह थ्रेड ओवरराइड है, और इस ऑब्जेक्ट इंस्टेंस पर रन फ़ंक्शन को कॉल किया जाता है। दूसरे धागे के लिए भी यही काम किया जाता है। इन दोनों थ्रेड्स को तब 'स्टार्ट' फंक्शन के साथ बुलाया जाता है।