2013-06-04 10 views
18

बनाम सिंक्रनाइज़ जावा में संगामिति पढ़ते समय, मैं निम्नलिखित है संदेह:सेमाफोर

  1. करता जावा निचले स्तर निर्माण तो तुल्यकालन के लिए सिंक्रनाइज़ प्रदान करता है?

  2. किन परिस्थितियों हम सेमाफोर सिंक्रनाइज़ से अधिक (जो जावा में नजर रखने के व्यवहार प्रदान करता है)

+0

मुझे प्रश्न 1 के लिए लगता है, हम पुनर्वित्त लॉक और हालत वस्तुओं का उपयोग कर सकते हैं, वे निम्न स्तर की संरचनाएं हैं। – Addict

उत्तर

34

समन्वयित एक ही समय में संसाधन का उपयोग करने के लिए निष्पादन की केवल एक धागा अनुमति देता है का उपयोग करेगा। सेमफोर एन (आप एन को चुनने के लिए) एक ही समय में संसाधन तक पहुंचने के लिए निष्पादन के धागे की अनुमति देता है।

8
  1. वहाँ भी, volatile कीवर्ड है http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.htmlvolatile चर पहुँच के अनुसार सूत्र है कि एक संसाधन का उपयोग कर सकते हैं की संख्या को सीमित करने के लिए प्रयोग किया जाता है सिंक्रनाइज़ कोड

  2. java.util.concurrent.Semaphore के माध्यम से इन चर तक पहुँचने से अधिक कुशल है। यही है, जबकि synchronized केवल एक थ्रेड को लॉक करने के लिए अनुमति देता है और सिंकोननाइज्ड ब्लॉक/विधि निष्पादित करता है, सेमफोर एन थ्रेड को अनुमति देता है और दूसरों को अवरुद्ध करता है।

+0

सिंक्रनाइज़ेड थ्रेड हस्तक्षेप और स्मृति स्थिरता त्रुटियों दोनों के समाधान प्रदान करता है, हालांकि अस्थिर केवल स्मृति स्थिरता त्रुटियों के समाधान प्रदान करता है, इसलिए हम संचालन में परमाणुता प्रदान करने के लिए अस्थिरता का उपयोग नहीं कर सकते हैं, क्या मुझे यहां कुछ याद आ रहा है? – Addict

+0

अस्थिरता लंबे/डबल –

+0

पर परमाणु पहुंच प्रदान करता है अस्थिर के साथ आप अभी भी गंदे पढ़ सकते हैं और अपने साझा मूल्य दूषित कर सकते हैं। तो यह सिंक्रनाइज़ करने के लिए एक विकल्प नहीं है। –

2

atomics भी है। यह मूल हार्डवेयर तुलना-और-स्वैप कमांड तक पहुंच प्रदान करता है जो सभी सिंक्रनाइज़ेशन का आधार है। यह आपको, उदाहरण के लिए, सुरक्षित रूप से एक संख्या बढ़ाने के लिए अनुमति देता है। यदि आप ++ एक अस्थिर फ़ील्ड करते हैं, तो एक ही थ्रेड उसी निष्पादन को निष्पादित करने से पहले आपके धागे को लिखने से पहले फ़ील्ड पढ़ सकता है, फिर पर के बाद अपना धागा लिखें। तो एक वृद्धि खो जाती है। परमाणु पढ़ते हैं और "परमाणु रूप से लिखते हैं" और इसलिए समस्या से बचें।

वास्तव में, वाष्पशील, सिंक्रनाइज़ बयान, और एटोमिक्स मजबूर करने के लिए सभी धागा डेटा मुख्य स्मृति से ताजा कर और/या मुख्य स्मृति के लिए लिखा हो जाते हैं के रूप में उपयुक्त है, तो उनमें से कोई भी वास्तव में कि निम्न स्तर है। (मैं सी को सरल बना रहा हूं। सी # के विपरीत, जावा में वास्तव में "मुख्य स्मृति" की अवधारणा नहीं है।)

संबंधित मुद्दे