Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

जावा में मेमोरी कंसिस्टेंसी त्रुटि

जब मल्टीथ्रेडिंग की अवधारणा लागू की जाती है, तो यह संभव है कि एक थ्रेड द्वारा किए गए परिवर्तन दूसरे थ्रेड को दिखाई न दें। यह इंगित करता है कि प्रत्येक थ्रेड का दृष्टिकोण एक-दूसरे के संबंध में असंगत है। इसे मेमोरी कंसिस्टेंसी त्रुटि के रूप में जाना जाता है।

CPU मुख्य मेमोरी को एक अलग क्रम में एक्सेस कर सकता है, जबकि थ्रेड्स उन्हें अलग क्रम में एक्सेस कर सकते हैं।

यह आमतौर पर तब होता है जब राइट ऑपरेशन किया जा रहा हो, जिससे CPU प्रतीक्षा समय से बचा जाता है।

राइट ऑपरेशन एक परमाणु ऑपरेशन है, जिसका अर्थ है कि जब एक राइट ऑपरेशन किया जा रहा हो तो अन्य थ्रेड्स द्वारा कोई अन्य ऑपरेशन नहीं किया जाएगा।

इसके अलावा, जिस क्रम में राइट ऑपरेशन किया जाता है, वह हर संबद्ध CPU के लिए सुसंगत रूप से बनाए रखा जाएगा, जबकि CPU अन्य CPU के राइट समय को अलग तरीके से समझ सकते हैं। यह घटना मेमोरी असंगति का कारण बन सकती है।

मेमोरी असंगति त्रुटियों से कैसे बचें?

हैपन्स-बिफोर संबंध स्थापित करने की आवश्यकता है ताकि एक थ्रेड द्वारा मेमोरी राइट किया जाए, और यह उसी मेमोरी पर अन्य थ्रेड द्वारा किए गए रीड ऑपरेशन को दिखाई दे।

'start' फंक्शन और 'join' फंक्शन को हैपन्स-बिफोर संबंध माना जाता है। 'start' फंक्शन यह सुनिश्चित करता है कि नव निर्मित थ्रेड दिखाई दे। 'join' फंक्शन यह सुनिश्चित करता है कि दिखाई देने वाला थ्रेड दूसरे थ्रेड से जुड़ा हुआ है।

उदाहरण

import java.io.*; 

class SharedClass { 
    static int m = 2; 
    
    void inc() { 
        for (int j = 0; j < 5; j++) { 
            m = m + 1; 
            System.out.println("इन्क्रीमेंट के बाद है " + m); 
        } 
    } 
    
    void dec() { 
        for (int j = 0; j < 5; j++) { 
            m = m - 1; 
            System.out.println("डिक्रीमेंट के बाद है " + m); 
        } 
    } 
} 

public class Demo { 
    public static void main(String[] args) { 
        final SharedClass my_inst = new SharedClass(); 
        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(); 
    } 
}

आउटपुट

इन्क्रीमेंट के बाद है 3 
डिक्रीमेंट के बाद है 2 
डिक्रीमेंट के बाद है 2 
डिक्रीमेंट के बाद है 1 
इन्क्रीमेंट के बाद है 3 
डिक्रीमेंट के बाद है 0 
इन्क्रीमेंट के बाद है 1 
इन्क्रीमेंट के बाद है 1 
डिक्रीमेंट के बाद है 0 
इन्क्रीमेंट के बाद है 2

व्याख्या: 'SharedClass' नामक एक क्लास एक स्थिर मान परिभाषित करती है, और एक void फंक्शन, जो संख्याओं के एक सेट पर पुनरावृति करता है, और इसे इन्क्रीमेंट करता है और कंसोल पर प्रदर्शित करता है। 'dec' नामक एक अन्य फंक्शन संख्याओं के एक सेट पर पुनरावृति करता है और हर बार डिक्रीमेंट करता है और आउटपुट को कंसोल पर प्रदर्शित करता है। Demo नामक एक क्लास मुख्य फंक्शन रखती है जो क्लास का एक इंस्टेंस बनाता है, और एक नया थ्रेड बनाता है। इस थ्रेड को ओवरराइड किया जाता है, और इस ऑब्जेक्ट इंस्टेंस पर run फंक्शन को कॉल किया जाता है। दूसरे थ्रेड के लिए भी यही किया जाता है। दोनों थ्रेड्स को फिर 'start' फंक्शन के साथ कॉल किया जाता है।

समाधान: सिंक्रोनाइजेशन

synchronized void inc() { ... }
synchronized void dec() { ... }

// या
synchronized(this) {
    m = m + 1;
}

सिंक्रोनाइज्ड ब्लॉक/मेथड्स हैपन्स-बिफोर संबंध स्थापित करते हैं, मेमोरी विजिबिलिटी सुनिश्चित करते हैं।

  1. विंडोज अपग्रेड के बाद इंटेल ऑप्टेन मेमोरी पिनिंग एरर को ठीक करें विंडोज अपग्रेड के बाद इंटेल ऑप्टेन मेमोरी पिनिंग एरर को ठीक करें

    यदि आप अपने विंडोज 11/10 इंस्टॉलेशन को हाल के सार्वजनिक रिलीज विंडोज 11/10 में अपग्रेड करने के बाद इंटेल ऑप्टेन मेमोरी पिनिंग एरर का सामना करते हैं, तो यह पोस्ट आपकी मदद करने के लिए है। इस पोस्ट में, हम इस एरर के संभावित कारण की पहचान करेंगे, साथ ही इस एरर को हल करने के लिए आप जिस उपयुक्त समाधान को

  1. समाधान: ERR_SOCKET_NOT_CONNECTED त्रुटि ठीक करें समाधान: ERR_SOCKET_NOT_CONNECTED त्रुटि ठीक करें

    Google Chrome उपयोगकर्ता त्रुटि संदेश ERR_SOCKET_NOT_CONNECTED का अनुभव करते हैं जब वे अपने ब्राउज़र पर Google वेबसाइटों तक पहुंचने का प्रयास करते हैं। इस त्रुटि संदेश के कई अलग-अलग परिदृश्य हैं। एक जहां उपयोगकर्ता किसी भी वेबसाइट तक पहुंचने में असमर्थ है और दूसरा जहां Google साइटों को छोड़कर सभी वे

  1. IRQL_NOT_LESS_OR_EQUAL (0x0000000A) बग चेक का समाधान – ड्राइवर और मेमोरी फिक्स IRQL_NOT_LESS_OR_EQUAL (0x0000000A) बग चेक का समाधान – ड्राइवर और मेमोरी फिक्स

    IRQL_NOT_LESS_OR_EQUAL एरर को ठीक करें यदि आप बग चेक मान 0x0000000A के साथ उपरोक्त एरर कोड का सामना करते हैं, तो यह इंगित करता है कि एक कर्नेल-मोड ड्राइवर ने उठे हुए इंटरप्ट रिक्वेस्ट लेवल (IRQL) पर एक अमान्य पते पर पेज्ड मेमोरी एक्सेस की। संक्षेप में, ड्राइवर ने उस मेमोरी पते तक पहुंचने का प्रयास क