2009-11-04 15 views
21

मैं जावा में वास्तव में नया हूं और मैंने पढ़ा है कि "सिंक्रनाइज़" जावा में "बहुत महंगा" है। मैं जानना चाहता हूं कि महंगा क्या है और यह महंगा कैसे है? धन्यवाद।जावा में महंगे सिंक्रनाइज़ क्यों हैं?

+16

ओह लड़का! यह कीड़े का एक खोल खोलने जा रहा है। मैं भी शुरू नहीं करना चाहता ... –

उत्तर

29

Maybe it's not as bad as you think

यह भयानक होने के लिए (जो संभवतः इसी कारण आप पढ़ा है कि यह "बहुत महंगा") का इस्तेमाल किया। ये memes बाहर मरने के लिए

Here इसके बारे में एक अच्छा लेख है एक लंबा समय लग सकता

कैसे महंगा तुल्यकालन है?

कैश फ्लशिंग और अमान्यता से जुड़े नियमों के कारण, जावा भाषा में एक सिंक्रनाइज़ ब्लॉक आम तौर पर कई प्लेटफॉर्म द्वारा प्रदान की जाने वाली महत्वपूर्ण अनुभाग सुविधाओं की तुलना में अधिक महंगा होता है, जिसे आम तौर पर परमाणु "परीक्षण और सेट बिट" मशीन निर्देश के साथ लागू किया जाता है । यहां तक ​​कि जब एक प्रोग्राम में एक एकल प्रोसेसर पर चलने वाला केवल एक थ्रेड होता है, तब भी एक सिंक्रनाइज़ विधि कॉल एक असीमित विधि कॉल से धीमी है। यदि सिंक्रनाइज़ेशन को वास्तव में लॉक के लिए संघर्ष की आवश्यकता होती है, तो प्रदर्शन जुर्माना काफी अधिक होता है, क्योंकि कई थ्रेड स्विच और सिस्टम कॉल आवश्यक होंगे।

सौभाग्य से, JVM में लगातार सुधार दोनों बेहतर समग्र जावा प्रोग्राम प्रदर्शन किया है और प्रत्येक रिलीज़ के साथ तुल्यकालन के रिश्तेदार लागत कम है, और भविष्य में सुधार प्रत्याशित हैं। इसके अलावा, सिंक्रनाइज़ेशन की प्रदर्शन लागत अक्सर अतिस्तरीय होती है। एक प्रसिद्ध स्रोत ने उद्धृत किया है कि एक सिंक्रनाइज़ विधि कॉल एक असीमित विधि कॉल की तुलना में 50 गुना धीमी है। हालांकि यह कथन सत्य हो सकता है, यह भी काफी भ्रामक है और कई डेवलपर्स को ऐसे मामलों में भी सिंक्रनाइज़ करने से बचने के लिए प्रेरित किया गया है जहां इसकी आवश्यकता है।

यह कहकर कि - समवर्ती प्रोग्रामिंग अभी भी धीमी हो सकती है, लेकिन इसमें से अधिकतर पूरी तरह जावा की गलती नहीं है। ठीक और मोटे लॉकिंग के बीच एक व्यापार है। बहुत मोटा स्पष्ट रूप से बुरा है, लेकिन यह भी बहुत अच्छा होना संभव है, क्योंकि ताले की शून्य लागत नहीं है।

यह विवाद के तहत विशेष संसाधन पर विचार करने के लिए महत्वपूर्ण है। मैकेनिकल हार्ड डिस्क एक उदाहरण हैं जहां अधिक धागे खराब प्रदर्शन कर सकते हैं।

+0

क्या अब कोई नया लेख है? ऐसा लगता है कि इस आलेख के समय जावा 1.4 जारी नहीं किया गया था। चूंकि यह पोस्ट सिंक्रनाइज़ेशन प्रदर्शन के लिए Google के शीर्ष तीन पर है, इसलिए लोगों को इस पुराने लेख को पढ़ने का गलत विचार हो सकता है। धन्यवाद। – Teddy

+0

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

11

यह महंगा क्योंकि अगर आप धागे का उपयोग कर रहे हैं, और धागे के एक नंबर कोड का एक सिंक्रनाइज़ अनुभाग के माध्यम से जाना है, उनमें से केवल एक एक समय में क्रियान्वित किया जा सकता है।

यह एक बाधा की तरह है।

यह भी महंगा है जब आप एक ही धागे का उपयोग यह वैसे भी जांच करने के लिए वह चलाने के लिए अनुमति दी है अगर नहीं रही हैं।

आप सिंक्रनाइज़ खंडों के उपयोग को कम यदि आपका धागा अगर वे चला सकते हैं देखने के लिए बंद करने के लिए नहीं होगा

कैसे तुल्यकालन की एक उच्च स्तरीय अवलोकन (बेशक, वे डेटा साझा करने की जरूरत नहीं है) काम करता है here

http://img20.imageshack.us/img20/2066/monitor28synchronizatioc.png

एक जावा शैली पर नजर रखने के

+0

छवि नीचे ..... – Pacerier

5

यह अधिक आईबीएम में वास्तव में article पाया जा सकता है सिंक्रनाइज़ेशन के पीछे मुख्य बिंदुओं को बहुत अच्छी तरह से सारांशित करता है।

क्योंकि कैश फ्लशिंग और अमान्यकरण से जुड़े नियमों का

, जावा भाषा में एक तुल्यकालन ब्लॉक आम तौर पर एक से अधिक महत्वपूर्ण अनुभाग कई प्लेटफार्मों द्वारा की पेशकश की सुविधाओं, जो आमतौर पर एक परमाणु के साथ लागू कर रहे हैं "परीक्षण और बिट सेट" महंगा है मशीन निर्देश। यहां तक ​​कि जब एक प्रोग्राम में एक एकल प्रोसेसर पर चलने वाला केवल एक थ्रेड होता है, तब भी एक सिंक्रनाइज़ विधि कॉल एक असीमित विधि कॉल से धीमी है। यदि सिंक्रनाइज़ेशन को वास्तव में लॉक के लिए संघर्ष की आवश्यकता होती है, तो प्रदर्शन जुर्माना काफी अधिक होता है, क्योंकि कई थ्रेड स्विच और सिस्टम कॉल आवश्यक होंगे।

+16

कृपया ध्यान रखें कि आलेख उद्धरण का नवीनतम जावा संस्करण जावा 1.3 है। वह संस्करण मई 2000 में जारी किया गया था और लंबे समय से ईओएलड किया गया है। जबकि बुनियादी तथ्य कुछ हद तक समान रहते हैं (जावा मेमोरी मॉडल इसमें से कुछ बदल गया है), वहां कई अनुकूलन हुए हैं जो उदाहरण के लिए अनचाहे मामले में सिंक्रनाइज़ेशन को बहुत सस्ते बनाते हैं। –

+0

एस/unontested/uncontested/जाहिर है। –

+3

और, ज़ाहिर है, कोड ब्लॉक के पारस्परिक-बहिष्कार, और स्मृति की समेकन मौलिक रूप से जरूरी है जब बहुभाषी कोड लिखते हैं, और जावा से बचने के लिए जावा में "चालाक" चाल (केवल संक्षेप में टूटे हुए) नहीं हैं। यदि आपके दो धागे को बातचीत करना है, तो आपको सिंक्रनाइज़ करना होगा - शुद्ध और सरल। Granularity सिंक्रनाइज़ेशन एकमात्र सवाल शेष है। –

5

यह है कि जावा के लिए विशिष्ट नहीं है। यदि सही तरीके से नहीं किया जाता है तो सिंक्रनाइज़ेशन को किसी भी बहु-थ्रेडेड वातावरण में "महंगा" माना जा सकता है। चाहे जावा में यह विशेष रूप से खराब है, मुझे नहीं पता।

यह समवर्ती चलती अगर वे एक ही संसाधन का उपयोग से धागे से बचाता है। लेकिन, चूंकि वे समान संसाधन का उपयोग करते हैं, तो कोई बेहतर विकल्प नहीं है (इसे किया जाना है)।

समस्या यह है कि लोग अक्सर संसाधनों की रक्षा बहुत बड़े पैमाने पर करते हैं। उदाहरण के लिए, एक बुरी तरह से डिज़ाइन किया गया प्रोग्राम सरणी में प्रत्येक व्यक्तिगत तत्व (या सरणी का एक अनुभाग) की बजाय वस्तुओं की एक संपूर्ण सरणी को सिंक्रनाइज़ कर सकता है।

इसका मतलब यह होगा कि एक धागा एक धागा पढ़ने के लिए इंतज़ार करना होगा तत्व 7 पढ़ने का प्रयास या तत्व 22. आवश्यक नहीं लिख रहे हैं। यदि सिंक्रनाइज़ेशन की ग्रैन्युलरिटी सरणी स्तर के बजाय तत्व स्तर पर थी, तो वे दो धागे एक दूसरे के साथ हस्तक्षेप नहीं करेंगे।

केवल जब दो धागे तक पहुंचने का प्रयास करते हैं तो तत्व संसाधन विवाद होगा। यही कारण है कि सामान्य नियम केवल संसाधन के रूप में संभवतः छोटे संसाधनों की रक्षा करना है (निश्चित रूप से सिंक्रनाइज़ेशन की संख्या पर सीमाओं के अधीन)।

लेकिन, ईमानदारी से, यह कोई बात नहीं है कि यह कैसे महंगा है अगर विकल्प दो धागे के लिए एक एकल संसाधन को लेकर लड़ रहे वजह से डेटा भ्रष्टाचार है। अपना आवेदन सही तरीके से लिखें और केवल प्रदर्शन समस्याओं के बारे में चिंता करें जब वे प्रकट होते हैं ("इसे पहले पर काम करें, तो इसे तेजी से काम करें" मेरा पसंदीदा मंत्र है)।

2

अन्य उत्तर तकनीकी विस्तार है कि मैं दोहराने के लिए प्रयास करने के लिए नहीं जा रहा हूँ का एक अच्छा स्तर दे।

मुझे क्या करना होगा लेख की तारीखों की जाँच करने के लिए सलाह (और साथ ही निहित क्षमता और लेखक के बारे में जागरूकता) है। जावा में सिंक्रनाइज़ेशन पहले जेवीएम में बहुत धीमा था।हालांकि, यह हाल ही में बहुत सुधार हुआ है, इस तरह कि अनचाहे सिंक्रनाइज़ेशन आपके विचार से बहुत तेज़ है, और अनचाहे सिंक्रनाइज़ेशन में भी सुधार हुआ है।

आपको याद है, यह प्रश्न संभवतः कोई फर्क नहीं पड़ता - अगर आपको शुद्धता सुनिश्चित करने के लिए सिंक्रनाइज़ करने की आवश्यकता है, तो को की आवश्यकता है ताकि शुद्धता सुनिश्चित करने के लिए सिंक्रनाइज़ किया जा सके। एकमात्र बार जब मैं गति को एक मुद्दा मान सकता हूं तो यह है कि यदि आप इसके बजाय लॉकलेस कार्यान्वयन (बहुत कुशल अभी तक जटिल java.util.concurrent.locks.AbstractQueuedSynchronizer का उपयोग करके), या शायद इसके बजाय अपने कार्य के लिए किसी अन्य भाषा का उपयोग करने पर विचार कर रहे हैं।

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