का उपयोग इसलिए मैं synchronized
कीवर्ड के साथ परीक्षण कर रहा था।जावा सीखना, सिंक्रनाइज़ किए गए कीवर्ड
public class MyTest {
static int i = 0;
public static void main(String[] args) {
new Thread(t1).start();
new Thread(t2).start();
}
private static void countMe(String name){
i++;
System.out.println("Current Counter is: " + i + ", updated by: " + name);
}
private static Runnable t1 = new Runnable() {
public void run() {
try{
for(int i=0; i<5; i++){
countMe("t1");
}
} catch (Exception e){}
}
};
private static Runnable t2 = new Runnable() {
public void run() {
try{
for(int i=0; i<5; i++){
countMe("t2");
}
} catch (Exception e){}
}
};
}
जब मैंने इसे चलाने के लिए, दो धागे से countMe()
विधि बुला के उत्पादन में इस उत्पादन उत्पन्न करता है:
Current Counter is: 1
Current Counter is: 2
Current Counter is: 4
Current Counter is: 5
Current Counter is: 6
Current Counter is: 7
Current Counter is: 3
Current Counter is: 8
Current Counter is: 9
Current Counter is: 10
और जब मैं करने के लिए विधि countMe()
बदलने के लिए:
Current Counter is: 1
Current Counter is: 2
Current Counter is: 3
Current Counter is: 4
Current Counter is: 5
Current Counter is: 6
Current Counter is: 7
Current Counter is: 8
Current Counter is: 9
Current Counter is: 10
01:
private synchronized static void countMe(){
i++;
System.out.println("Current Counter is: " + i);
}
मैं इस आउटपुट प्राप्त
हालांकि यह मुझे synchronized
के उद्देश्य को स्पष्ट रूप से समझने देता है, मैं जानना चाहता हूं कि कोई अन्य कारण भी है, हम synchronized
का उपयोग कर सकते हैं। या मैंने जो किया है, वह एकमात्र आसान तरीका है कि हमें इस synchronized
कीवर्ड के उपयोग की आवश्यकता क्यों है?
धन्यवाद।
संपादित करें: एक और बात यह है कि मैं के साथ उलझन में हूँ कि पहली उत्पादन क्यों काउंटर 7. के बाद 3 के लिए गया था यह मेरे लिए थोड़ा असंभव लगता है, लेकिन इसी तरह के परिणाम हर बार जब मैं कोशिश हो कर में, यह सामान्य है है ?
कोई गारंटी नहीं है कि थ्रेड वैकल्पिक होंगे। थ्रेड जो 3 गिना जाता है, तब तक मुद्रित नहीं हो सकता है जब तक कि अन्य धागे की गणना 7 के बाद न हो। –
धन्यवाद, लेकिन 7 के बाद की तरह अगला कॉल प्रिंट 3 कैसे हो सकता है। मेरा मतलब है कि यह 6 या 5 तक प्रिंट कर सकता है, लेकिन ऐसा लगता है कि यह नई विधि कॉल मैंने 3 के बाद पढ़ा नहीं, यह बहुत अजीब लगता है। तो आपको लगता है कि जब भी मुझे 2 या अधिक धागे से कोड के समान ब्लॉक का उपयोग करना होता है तो हमेशा सिंक्रनाइज़ेशन का उपयोग करना बुद्धिमान होना चाहिए ?? – 911TurboS
मेरा सुझाव है कि आप धागे के नाम को प्रिंट करें और यह भ्रम कहां है, यह और अधिक स्पष्ट हो जाएगा। Concurrency एक जटिल विषय है और कोई आसान जवाब नहीं है। मेरी प्राथमिकता अभिनेता पैटर्न का उपयोग करना और थ्रेड के बीच जितना संभव हो उतना छोटा डेटा साझा करना है। आदर्श, कोई नहीं। एक धागा प्रदर्शन कोड बहुत कुशलता से आमतौर पर पर्याप्त से अधिक है। –