तुल्यकालन इस कोड में सही ढंग से काम करता है:सिंक्रनाइज़ेशन दूसरे कोड में क्यों काम नहीं करता है?
class PrintNumbers {
synchronized public void display() {
System.out.println("in display");
for (int i = 0; i < 3; i++) {
System.out.println("Thread name : "+ Thread.currentThread().getName() + " i= " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.getMessage();
}
}
System.out.println("out of display");
}
}
class MyThread implements Runnable {
Thread t;
PrintNumbers printNumbers;
MyThread(PrintNumbers printNumbers, String s) {
this.printNumbers = printNumbers;
t = new Thread(this,s);
t.start();
}
public void run() {
printNumbers.display();
}
}
class SyncExample {
public static void main(String[] args) {
PrintNumbers printNumbers = new PrintNumbers();
new MyThread(printNumbers, "My Thread 1");
new MyThread(printNumbers, "My Thread 2");
}
}
आउटपुट:
in display
Thread name : My Thread 1 i= 0
Thread name : My Thread 1 i= 1
Thread name : My Thread 1 i= 2
out of display
in display
Thread name : My Thread 2 i= 0
Thread name : My Thread 2 i= 1
Thread name : My Thread 2 i= 2
out of display
लेकिन इस कोड में:
class PrintNumbers {
synchronized public void display() {
System.out.println("in display");
for (int i = 0; i < 3; i++) {
System.out.println("Thread name : "+ Thread.currentThread().getName() + " i= " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.getMessage();
}
}
System.out.println("out of display");
}
}
class MyThread implements Runnable {
Thread t;
PrintNumbers printNumbers;
MyThread(String s) {
this.printNumbers = new PrintNumbers();
t = new Thread(this,s);
t.start();
}
public void run() {
printNumbers.display();
}
}
class SyncExample {
public static void main(String[] args) {
new MyThread("My Thread 1");
new MyThread("My Thread 2");
}
}
आउटपुट:
in display
Thread name : My Thread 1 i= 0
in display
Thread name : My Thread 2 i= 0
Thread name : My Thread 1 i= 1
Thread name : My Thread 2 i= 1
Thread name : My Thread 2 i= 2
Thread name : My Thread 1 i= 2
out of display
out of display
मुझे समझ में नहीं आता कि क्या अंतर wrt सिंक्रनाइज़ेशन रननेबल MyThread में और SyncExample क्लास में PrintNumbers को प्रारंभ करने के लिए करता है। कृपया समझाएँ।
गैर स्थैतिक सिंक्रनाइज़ विधियां 'इस' पर सिंक्रनाइज़ करें। – tkausl
2 आपको 'डिस्प्ले' विधि स्थिर की आवश्यकता है, वे 2 ऑब्जेक्ट लॉक कर रहे हैं। – passion
आप PrintNumbers के अंतर ऑब्जेक्ट का उपयोग कर रहे हैं और लॉक ऑब्जेक्ट स्तर पर है। यही कारण है कि आप अलग आउटपुट प्राप्त कर रहे हैं। – cody123