मेरे पास एक थ्रेड क्लास है जो इंस्टेंस वैरिएबल के रूप में चलने योग्य और int काउंटर लागू करती है। दो सिंक्रनाइज़ किए गए विधियां जोड़ें और उप। जब मैं अपनी टेस्ट क्लास चलाता हूं तो किसी भी समय यह गलत परिणामों को दो बार प्रिंट कर रहा है। जहां तक मैं समझता हूं कि जब कोई विधि सिंक्रनाइज़ होती है, तो संपूर्ण ऑब्जेक्ट को अन्य थ्रेडों तक पहुंचने के लिए लॉक कर दिया जाएगा, इस तर्क के साथ हर बार हमें एक ही परिणाम मिलना चाहिए? कुछ कैसे मामला नहीं है। क्या मैं कुछ भूल रहा हूँ?जावा थ्रेड के साथ असंगत परिणाम
मेरी मशीन विंडोज 7, 64 बिट है।
public class ThreadClass implements Runnable {
int counter = 0;
@Override
public void run() {
add();
sub();
}
public synchronized void add() {
System.out.println("ADD counter" + (counter = counter + 1));
}
public synchronized void sub() {
System.out.println("SUB counter" + (counter = counter - 1));
}
}
Testclass
public class ThreadTest {
public static void main(String args[]) {
ThreadClass tc = new ThreadClass();
Thread tc0 = new Thread(tc);
tc0.start();
tc0.setPriority(Thread.MAX_PRIORITY);
Thread tc1 = new Thread(tc);
tc1.start();
tc1.setPriority(Thread.NORM_PRIORITY);
Thread tc2 = new Thread(tc);
tc2.start();
tc2.setPriority(Thread.MIN_PRIORITY);
}
}
परिणाम
ADD counter1
ADD counter2
SUB counter1
SUB counter0
ADD counter1
SUB counter0
नोट: आप रन की जोड़ी करने के लिए इस विसंगति का उत्पादन करने की आवश्यकता हो सकती।
आपको 'एडीडी विधि' में प्रिंटलाइन को 'एडीडी काउंटर' में बदलना चाहिए ताकि यह देखना आसान हो कि क्या हो रहा है और शायद प्रत्येक थ्रेड के लिए भी प्रदान और आईडी भी हो ताकि आप देख सकें कि कौन सा आउटपुट थ्रेड से आता है। – ChrisWue
@ChrisWue। मैं फिर से अद्यतन System.out के साथ भाग गया। पॉइंटिंग के लिए धन्यवाद। – kosa