मैं यह पता लगाने की कोशिश कर रहा हूं कि सिंक्रनाइज़ तरीके कैसे काम करते हैं। मेरी समझ से मैंने दो धागे T1 और T2 बनाए हैं जो एक ही विधि को addNew
कहेंगे, क्योंकि यह विधि सिंक्रनाइज़ है, क्या इसे सभी पुनरावृत्तियों को निष्पादित नहीं करना चाहिए एक धागे के लिए लूप के लिए और फिर दूसरा? आउटपुट बदलता रहता है, कभी-कभी यह इसे सही प्रिंट करता है, दूसरी बार यह T1 के मानों को T2 मानों के साथ मिश्रित करके प्रिंट करता है। कोड बहुत आसान है, क्या कोई बता सकता है कि मैं क्या गलत कर रहा हूं? शुक्रिया।
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(new A());
Thread t2 = new Thread(new A());
t1.setName("T1");
t2.setName("T2");
t1.start();
t2.start();
}
}
public class B {
public synchronized void addNew(int i){
Thread t = Thread.currentThread();
for (int j = 0; j < 5; j++) {
System.out.println(t.getName() +"-"+(j+i));
}
}
}
public class A extends Thread {
private B b1 = new B();
@Override
public void run() {
b1.addNew(100);
}
}
3 जवाब
प्रत्येक A
इंस्टेंस का अपना B
इंस्टेंस होता है। विधि addNew
B
की एक आवृत्ति विधि है। इसलिए, addNew
को कॉल के दौरान निहित रूप से प्राप्त किया गया लॉक रिसीवर B
इंस्टेंस पर लॉक है। प्रत्येक थ्रेड addNew
को अलग B
पर कॉल कर रहा है, और इसलिए अलग-अलग तालों पर लॉक कर रहा है।
यदि आप चाहते हैं कि सभी B
इंस्टेंस एक सामान्य लॉक का उपयोग करें, तो एकल साझा लॉक बनाएं, और इसे addNew
के मुख्य भाग में प्राप्त करें।
B
के सभी उदाहरणों में साझा किया गया हो। private static final Object lock = new Object()
.
Runnable
इंस्टेंस पास करें, जो अक्सर किया जाता है।
दोनों A
ऑब्जेक्ट की अपनी-अपनी B
ऑब्जेक्ट हैं। आपको उन्हें B
साझा करने की आवश्यकता है ताकि सिंक्रनाइज़ेशन का प्रभाव हो सके।
ये कोशिश करें :
public class Main {
public static void main(String[] args) {
A a = new A();
Thread t1 = new Thread(a);
Thread t2 = new Thread(a);
t1.setName("T1");
t2.setName("T2");
t1.start();
t2.start();
}
}
class B {
public synchronized void addNew(int i){
Thread t = Thread.currentThread();
for (int j = 0; j < 5; j++) {
System.out.println(t.getName() +"-"+(j+i));
}
}
}
class A extends Thread {
private B b1 = new B();
@Override
public void run() {
b1.addNew(100);
}
}
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।
B
के विभिन्न इंस्टेंस के साथ सिंक्रोनाइज़ करते हैंA
दोनोंThread
का विस्तार करते हैं और एकThread
कंस्ट्रक्टर को पास कर दिया जाता है। ऐसा नहीं होना चाहिए।Thread
का विस्तार न करें,Runnable
का विस्तार करें।