उदाहरण
import java.io.*;
class DemoInstance {
static int val_1 = 6;
void incrementVal() {
for (int j = 1; j < 11; j++) {
val_1 = val_1 + 1;
System.out.println("इन्क्रीमेंट करने के बाद i का मान है " + val_1);
}
}
void decrementVal() {
for (int j = 1; j < 11; j++) {
val_1 = val_1 - 1;
System.out.println("डिक्रीमेंट करने के बाद i का मान है " + val_1);
}
}
}
public class Demo {
public static void main(String[] args) {
System.out.println("DemoInstance का इंस्टेंस बनाया गया");
System.out.println("थ्रेड इंस्टेंस बनाया गया");
final DemoInstance my_inst = new DemoInstance();
Thread my_thread_1 = new Thread() {
@Override
public void run() {
my_inst.incrementVal();
}
};
Thread my_thread_2 = new Thread() {
@Override
public void run() {
my_inst.decrementVal();
}
};
my_thread_1.start();
my_thread_2.start();
}
}
आउटपुट
DemoInstance का इंस्टेंस बनाया गया
थ्रेड इंस्टेंस बनाया गया
इन्क्रीमेंट करने के बाद i का मान है 7
इन्क्रीमेंट करने के बाद i का मान है 7
डिक्रीमेंट करने के बाद i का मान है 6
इन्क्रीमेंट करने के बाद i का मान है 8
डिक्रीमेंट करने के बाद i का मान है 7
इन्क्रीमेंट करने के बाद i का मान है 8
इन्क्रीमेंट करने के बाद i का मान है 8
डिक्रीमेंट करने के बाद i का मान है 7
इन्क्रीमेंट करने के बाद i का मान है 9
डिक्रीमेंट करने के बाद i का मान है 8
डिक्रीमेंट करने के बाद i का मान है 7
डिक्रीमेंट करने के बाद i का मान है 6
डिक्रीमेंट करने के बाद i का मान है 5
डिक्रीमेंट करने के बाद i का मान है 4
डिक्रीमेंट करने के बाद i का मान है 3
डिक्रीमेंट करने के बाद i का मान है 2
इन्क्रीमेंट करने के बाद i का मान है 3
इन्क्रीमेंट करने के बाद i का मान है 4
इन्क्रीमेंट करने के बाद i का मान है 5
इन्क्रीमेंट करने के बाद i का मान है 6
व्याख्या: 'DemoInstance' नामक एक क्लास एक स्थिर मान परिभाषित करती है, और एक void फंक्शन 'incrementVal', जो संख्याओं के एक सेट पर पुनरावृति करता है, और इसे इन्क्रीमेंट करता है और कंसोल पर प्रदर्शित करता है। 'decrementVal' नामक एक अन्य फंक्शन संख्याओं के एक सेट पर पुनरावृति करता है और हर बार डिक्रीमेंट करता है और आउटपुट को कंसोल पर प्रदर्शित करता है।
Demo नामक एक क्लास मुख्य फंक्शन रखती है जो क्लास का एक इंस्टेंस बनाता है, और एक नया थ्रेड बनाता है। इस थ्रेड को ओवरराइड किया जाता है, और इस ऑब्जेक्ट इंस्टेंस पर run फंक्शन को कॉल किया जाता है। दूसरे थ्रेड के लिए भी यही किया जाता है। दोनों थ्रेड्स को फिर 'start' फंक्शन के साथ कॉल किया जाता है।
थ्रेड इंटरफेरेंस क्या है?
जब दो या दो से अधिक थ्रेड्स साझा डेटा को एक साथ एक्सेस करते हैं और कम से कम एक थ्रेड डेटा को संशोधित करता है, तो ऑपरेशन एक-दूसरे के साथ हस्तक्षेप कर सकते हैं, जिससे अप्रत्याशित परिणाम होते हैं। उपरोक्त उदाहरण में, val_1++ और val_1-- परमाणु नहीं हैं - उनमें रीड, मॉडिफाई, राइट चरण शामिल हैं।
रोकथाम:
// सिंक्रोनाइज्ड मेथड
synchronized void incrementVal() { ... }
synchronized void decrementVal() { ... }
// या AtomicInteger का उपयोग
AtomicInteger val = new AtomicInteger(6);
val.incrementAndGet();
val.decrementAndGet();