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

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

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

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

यह आमतौर पर तब सच होता है जब लेखन कार्य किया जा रहा हो, जिससे 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' नाम का एक अन्य फ़ंक्शन हर बार संख्याओं और कमी के एक सेट पर पुनरावृति करता है और कंसोल पर आउटपुट प्रदर्शित करता है। एक क्लासनाम डेमो में मुख्य कार्य होता है जो कक्षा का एक उदाहरण बनाता है, और एक नया थ्रेड बनाता है। यह थ्रेड ओवरराइड है, और इस ऑब्जेक्ट इंस्टेंस पर रन फ़ंक्शन को कॉल किया जाता है। दूसरे धागे के लिए भी यही काम किया जाता है। इन दोनों थ्रेड्स को तब 'स्टार्ट' फंक्शन के साथ बुलाया जाता है।


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

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

  1. ठीक करें:ERR_SOCKET_NOT_CONNECTED

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

  1. IRQL_NOT_LESS_OR_EQUAL त्रुटि ठीक करें

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