2010-07-09 19 views
13

क्या एक चर जो एकाधिक थ्रेड द्वारा उपयोग किया जाता है, लेकिन केवल सिंक्रनाइज़ किए गए ब्लॉक के अंदर, अस्थिर संशोधक की आवश्यकता होती है? यदि नहीं, क्यों?जावा अस्थिर संशोधक और सिंक्रनाइज़ ब्लॉक

+1

आपको इस प्रश्न में भी रुचि हो सकती है: http://stackoverflow.com/questions/3103204/difference-between-synchronization-of-field-reads-and-volatile –

+0

नहीं। इस रिलेबल एसई प्रश्न का संदर्भ लें: http : //stackoverflow.com/questions/3519664/difference-between-volatile-and-synchronized-in-java/34355995#34355995 –

उत्तर

8

आपको volatilesynchronized के अंदर उपयोग करने की आवश्यकता नहीं है, सिंक्रनाइज़ किए गए पहले से ही (हर एक्सेस पर) उपयोग किए जाने वाले चर के स्थानीय कैशिंग के लिए सही व्यवहार की गारंटी देता है।

volatile आदिम मूल्यों पर काम करता है, और परमाणु पहुंच के लिए एक प्राचीन शॉर्टकट हो सकता है। ध्यान दें कि 1.4 से जेडीके 5 में अस्थिरता का व्यवहार बदल गया है।

अधिक जानकारी पाया जा सकता है here

4

नहीं। जब आप एक सिंक्रनाइज़ किए गए ब्लॉक के भीतर काम करते हैं, तो सभी कैश किए गए चर एक्सेस पर सिंक्रनाइज़ होते हैं, क्योंकि यह स्मृति बाधा उत्पन्न करता है।

विवरण के लिए, volatile to synchronized के इस तुलना (चर्चा के साथ) देखें।

2

ब्लॉक कि एक ही वस्तु (या विधि) पर सिंक्रनाइज़ एक ही समय में नहीं चलाया जा की गारंटी है। तो जब तक आप एक ही ऑब्जेक्ट पर सिंक्रनाइज़ करते हैं, तो आपके चर के समवर्ती उपयोग कभी नहीं होंगे, इसलिए इसे विशेष उपचार की आवश्यकता नहीं है।

यदि आपकी पहुंच सिंक्रनाइज़ नहीं की गई है, तो आपके पास दौड़ की स्थिति है। परिवर्तनीय volatile कुछ आदिम चर के लिए सही हो सकता है (मैं वोल्टाइल पर बेहतर जानकारी के लिए अन्य पदों को रोकता हूं)। यदि यह उपयोगी नहीं है, तो आप लगभग निश्चित रूप से एक बग है।

+1

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

+1

समान रूप से पैडेंटिक होने के लिए, अन्य भाषाओं में आप शायद सोच रहे हैं (सी/सी ++) में धागे सिंक्रनाइज़ करने की एक आंतरिक धारणा नहीं है, या यहां तक ​​कि एक 'सिंक्रनाइज़' कीवर्ड भी है; आपको म्यूटेक्स के समान कुछ बनाना होगा। वहां आप सही हैं: आपके लिए स्मृति स्थिरता प्रबंधित करने के लिए कोई रनटाइम नहीं है। वे भाषाएं समवर्ती स्मृति पहुंच के लिए किसी भी अर्थशास्त्र को भी निर्दिष्ट नहीं करती हैं! शुक्र है कि जावा अच्छा है और केवल वही करता है जो आप उम्मीद करते हैं। – Karmastan

+0

@YannRamin जैसा कि, आप जिस सिंक्रनाइज़ पर सिंक्रनाइज़ करते हैं वह उस सिंक्रनाइज़ किए गए ब्लॉक में किए गए संशोधनों के उद्देश्य के लिए प्रभावी रूप से अस्थिर है? निश्चित नहीं है कि मैंने आपको सही तरीके से व्याख्या की है, लेकिन मुझे उस प्रभाव का कहीं और विवरण नहीं मिल रहा है। – spieden

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

  • कोई संबंधित समस्या नहीं^_^