मैं सोच रहा हूं कि जावा में वास्तव में "सिंक्रनाइज़" कैसे काम करता है।"सिंक्रनाइज़" वास्तव में क्या करता है? किसी फ़ंक्शन को लॉक करें या ऑब्जेक्ट फ़ंक्शन लॉक करें?
मान लें कि मैं एक बोर्ड-गेम मॉडल करता हूं जिसमें कई फ़ील्ड होते हैं। मैं फ़ील्ड को एक वर्ग (फ़ील्ड) और बोर्ड के रूप में एक वर्ग (बोर्ड) के रूप में कार्यान्वित करता हूं जिसमें कई फ़ील्ड शामिल हैं। चलिए आगे कहते हैं कि मैंने उस क्षेत्र में जाने के लिए एक खिलाड़ी के लिए फ़ील्ड में एक विधि चाल (प्लेयर पीएल) मॉडल किया है। प्रत्येक खिलाड़ी को धागे द्वारा दर्शाया जाता है।
हालांकि सभी थ्रेडों को एक साथ कुछ क्रियाएं करनी चाहिए (उदाहरण के लिए उनके डाइस रोलिंग), केवल एक खिलाड़ी होना चाहिए जो एक समय में चलता है।
मैं यह कैसे सुनिश्चित करूं? क्या विधि को स्थानांतरित करने के लिए पर्याप्त है (प्लेयर पीएल) सिंक्रनाइज़ किया गया है? या मुझे यह सुनिश्चित करने के लिए बोर्ड में एक कैस्केडिंग विधि की आवश्यकता होगी कि एक ही समय में केवल एक खिलाड़ी चलता है? (या क्या कोई बेहतर समाधान है)?
लब्बोलुआब यह करने के लिए इसे लाने के लिए:
"सिंक्रनाइज़" हर वस्तु इस पद्धति है या केवल वस्तु उपयोग में है कि में एक विधि ताला सिंक्रनाइज़ होता है कि में एक विधि ताला चाहेंगे?
और यदि दूसरा मामला है: क्या इस विधि को लागू करने वाले प्रत्येक ऑब्जेक्ट के लिए एक विधि को लॉक करने का कोई आसान तरीका है?
धन्यवाद !!!
class Field {
// instance of the board
private Board board;
public void moveTo(Player p){
synchronized (board) {
// move code goes here
}
}
}
यह इतना है कि बोर्ड के अनुसार, केवल एक ही खिलाड़ी एक समय में बढ़ रहा है यह कर देगा:
'सिंक्रनाइज़' कभी भी फ़ंक्शन, अवधि को लॉक नहीं करता है। आप केवल * ऑब्जेक्ट * पर ** ** लॉक कर सकते हैं। एक उदाहरण विधि के साथ, यह 'यह' है। एक स्थिर विधि के साथ, यह कक्षा वस्तु है जिसमें विधि परिभाषित की जाती है (MyClass.class)। –
सिर्फ इसलिए कि आपने पूछा कि मुझे मल्टीथ्रेडिंग की आवश्यकता क्यों है: वास्तव में मैं होमवर्क के रूप में किसी प्रकार का बहुउद्देशीय "पॅकमैन" गेम लागू कर रहा हूं। प्रत्येक खिलाड़ी और हर भूत एक धागा होना चाहिए। हालांकि, मुझे जांचने की ज़रूरत है, अगर कोई खिलाड़ी प्रत्येक चरण के बाद भूत या इसके विपरीत होता है। इस बिंदु पर मुझे कभी-कभी मुझे कुछ बताते हुए अपवाद मिलते हैं जैसे "घोस्ट-ए फील्ड-एक्सवाई से प्लेयर-बी को हटाना चाहता था, लेकिन प्लेयर-बी और नहीं था"। मुझे लगता है कि यह त्रुटि इस तथ्य से आती है कि धागे की चाल सिंक्रनाइज़ नहीं होती थी। – speendo
सिंक्रनाइज़िंग इस समस्या का एक समाधान होगा। लेकिन केवल एक ही नहीं। – Falmarri