क्या यह समय-समय पर सिंक्रनाइज़, प्रतीक्षा और सूचित करने के लिए है?


13

क्या एक एकल परिदृश्य (प्राचीन JVMs के साथ संगतता के अलावा) जहां का उपयोग synchronizedकरना बेहतर है Lock? किसी को भी नए सिस्टम का उपयोग waitया औचित्य कर सकते notifyहैं?

क्या कोई एल्गोरिथ्म है जो इसके कार्यान्वयन में उनमें से एक का उपयोग करना चाहिए ?

मैं एक पिछले प्रश्न देखता हूं जो इस मामले को छूता है लेकिन मैं इसे थोड़ा और आगे ले जाना चाहता deprecateहूं। उनके साथ अभी तक बहुत से जाल और नुकसान और गुह्य चीजें हैं जिन्हें नई सुविधाओं के साथ इस्त्री किया गया है। मुझे लगता है कि यह जल्द ही उन्हें अप्रचलित चिह्नित करने का समय हो सकता है।


4
क्या आपने ब्रायन गोएट्ज के जावा कंजरेन्सी इन प्रैक्टिस को पढ़ा है? वह निहित बनाम स्पष्ट लॉक बहस को अच्छी तरह से कवर करता है।
मार्टिज़न वेरबर्ग

@MartijnVerburg - दुख की बात है लेकिन मुझे उनके काम के लिए बहुत सम्मान है।
OldCurmudgeon

1
सिंक्रनाइज़ कीवर्ड सरल स्थिर विधियों के साथ उपयोगी हो सकता है जो कि थ्रेड सुरक्षित होना चाहिए, किसी भी चीज़ के लिए मैं समवर्ती का उपयोग करूंगा। लेकिन यह मेरी राय है
केमोडा

जवाबों:


12

क्या कोई एल्गोरिथ्म है जो इसके कार्यान्वयन में उनमें से एक का उपयोग करना चाहिए?

लगभग निश्चित रूप से नहीं। (वास्तव में, सैद्धांतिक दृष्टिकोण से, आपको अन्य java.util.cccurrent का उपयोग करके प्रतीक्षा / सूचना का अनुकरण करने में सक्षम होना चाहिए कक्षाएं और सिंक्रनाइज़ को स्पष्ट लॉक संचालन के साथ बदला जा सकता है ... हालांकि आपको अनलॉक करने के लिए सावधान रहने की आवश्यकता होगी। finallyखंड।)

हालांकि, संभवतः एल्गोरिदम हैं जहां जावा में सबसे अच्छा प्रदर्शन करने वाले कार्यान्वयन में सिंक्रनाइज़ेशन का प्रत्यक्ष उपयोग शामिल है, प्रतीक्षा और सूचना के बिना।


क्या यह समय-समय पर सिंक्रनाइज़, प्रतीक्षा और सूचित करने के लिए है?

पिछले प्रश्न के उत्तर के बावजूद, उत्तर निश्चित रूप से नहीं है।

प्रतीक्षा / सूचना सही तरीके से उपयोग की जा सकती है (और अक्सर होती है)। जावा में, डिप्रेसेशन उन वर्गों और विधियों के लिए आरक्षित है जो टूट गए हैं; यानी जहां निरंतर उपयोग को तात्कालिकता के रूप में ठीक किया जाना चाहिए। यदि सूर्य (और अब ओरेकल) ने कुछ को मौलिक रूप में और व्यापक रूप से प्रतीक्षा / सूचना के रूप में उपयोग किया, तो वे बड़ी मात्रा में विरासत कोड के लिए एक गंभीर संगतता समस्या पैदा करेंगे। यह किसी के हित में नहीं है।

यदि आप अपने कोड में सिंक्रनाइज़ / प्रतीक्षा / अधिसूचित से छुटकारा चाहते हैं, तो यह ठीक है। लेकिन आवश्यक रूप से सही बहु-थ्रेडेड कोड की बड़ी मात्रा के पुनर्लेखन के लिए पदावनति आह्वान, और वह एक BAD IDEA होगा। कॉर्पोरेट आईटी प्रबंधक और सॉफ्टवेयर उत्पाद प्रबंधक आपको यह सुझाव देने के लिए घृणा करेंगे ...


यह पढ़ने योग्य है कि जावा दस्तावेज के अनुसार "पदावनत" का क्या अर्थ है : http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html

और यह भी ध्यान दें कि हम जावा लैंग्वेज के मूल में होने वाले सामान के बारे में बात कर रहे हैं। पदावनति synchronizedके भारी परिणाम हैं।


वास्तव में, जहाँ तक मुझे याद है, उत्कृष्ट "जावा संगति अभ्यास में" पुस्तक के अनुसार, उपयोग java.util.concurrentकक्षाएं वास्तव में तेज़ हैं। इन वर्गों के पीछे सीधे वीएम से बात करते हैं, जहां सिंक्रनाइज़ेशन ऑब्जेक्ट ग्राफ में ऑब्जेक्ट पर एक ब्लंट लॉक स्थापित करता है और इस प्रकार वैश्विक प्रदर्शन को प्रभावित करता है।
अनकुहन

मुझे माफ कर दो @ स्टीफन अगर मैं सुझाव के रूप में आया कि हम वास्तव में synchronizedएट को हटा दें । अल। मैं केवल पदावनति का सुझाव दे रहा हूं, जो वास्तव में केवल यह कहता है कि नए कोड के लिए इसका उपयोग न करें। मैं अपने नुकसान को दूर करने की मांग कर मेरी विरासत की कोशिश की और परीक्षण किया हानिकारक क्षति का सुझाव देने का सपना नहीं होगा।
OldCurmudgeon 20

@OldCurmudgeon - देर से प्रतिक्रिया, लेकिन मुझे लगता है कि पदावनति बहुत चरम है। 1) इसका मतलब है कि फीचर को हटाया जा सकता है। 2) इसका मतलब है कि यह सुविधा टूटी हुई है, केवल पुराने जमाने से अलग है। 3) बहुत से लोग अभी भी इस तरह से नया कोड लिखने के लिए खुश हैं ... और इसका कोई मजबूत कारण नहीं है कि उन्हें नहीं करना चाहिए। 4) अन्य, कम "आपके चेहरे में" इसे हतोत्साहित करने के तरीके हैं; जैसे पीएमडी नियम लिखना ...
स्टीफन C

@StephenC - तो क्या हम उस पर थोड़े कम नाटकीय कार्रवाई कर सकते हैं, जिसके परिणामस्वरूप उन्हें कॉलेज में इस्तेमाल नहीं किया जाएगा या पढ़ाया नहीं जाएगा। उन्हें स्पष्ट रूप से बचना चाहिए। मुझे पीएमडी नियमों पर संदेह है - हालांकि एक अच्छा विचार - बहुत जल्दी शिक्षकों तक नहीं पहुंचेगा।
OldCurmudgeon

1
@StephenC एक नाइटपिक: आपके द्वारा लिंक किए गए जावा डॉक्स द्वारा जा रहा है, मुझे नहीं लगता कि डिप्रेसेशन का मतलब है कि डिप्रेस्ड कोड टूट गया है। यह एक कारण है, लेकिन जैसा कि डॉक्स कहते हैं, नए, बेहतर एपीआई (जैसे, ओपी का तर्क है, संगामिति के साथ मामला है) द्वारा एक एपीआई निकाला जा सकता है। और निम्न-स्तरीय संगति, यदि वास्तव में बुरी प्रथाओं को प्रोत्साहित नहीं करती है, तो निश्चित रूप से बहुत त्रुटि प्रवण है।
एंड्रेस एफ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.