2012-06-20 26 views
14

सरल प्रश्न: क्या जावा मेमोरी/सिंक्रनाइज़ेशन मॉडल गारंटी परमाणु सूचक लिखता है? यही कारण है कि अगर हम प्रतिस्पर्धा धागे है,:,क्या जावा पॉइंटर परमाणु लिखते हैं?

String shared; 

thread1() 
{ 
    shared = "a"; 
} 

thread2() 
{ 
    shared = "hello world"; 
} 

एक ही समय में शुरू कर दिया shared हमेशा null, "a", या "hello world" होने की गारंटी है?

+0

नोट, सामान्य रूप से, संदर्भ द्वारा संदर्भित ऑब्जेक्ट पूरी तरह से प्रारंभ नहीं किया जा सकता है। 'स्ट्रिंग' का सामान्य कार्यान्वयन ठीक होना चाहिए, हालांकि इस तरह के चीजों पर विनिर्देश बहुत अच्छा नहीं है। इसके अलावा कुछ मूल्यवान वास्तव में अपरिवर्तनीय प्रकार भी हैं। यदि आप इस तरह की चीज़ पर भरोसा करने का प्रयास करते हैं, तो आप शायद कुछ गलत कर रहे हैं (हालांकि यह समझने के लिए एक अच्छा कारण नहीं है)। –

उत्तर

3

यह उन तीन मानों में से एक होगा, हां - लेकिन जो अनिर्धारित है। "जीत" में आखिरी वाला।

आपने नहीं पूछा, लेकिन पूर्णता के लिए - यह "हैलो wor" या उस स्ट्रिंग का कुछ आंशिक संस्करण नहीं होगा।

4

हां। section 17.7 of the JLS से:

लिए लिखता है और संदर्भ की पढ़ता हमेशा परमाणु, चाहे वे 32-बिट या 64-बिट मूल्यों के रूप में लागू किया जाता है की परवाह किए बिना कर रहे हैं।

(मतलब यही कारण है कि यह नहीं है कि आप हमेशा "नवीनतम" मान दिखाई देगा, लेकिन यह एक अलग बात है।)

+0

एक अनुशासनिक के रूप में, जावा की विनिर्देश मांग परमाणु 64-बिट पॉइंटर क्यों लिखता है लेकिन 'लंबे' लिखने के लिए समान नहीं है? – donnyton

+0

@donnyton, संदर्भ परमाणु होना चाहिए और मुझे कोई भाषा नहीं है जहां संदर्भ/पॉइंटर्स परमाणु नहीं हैं (यदि सही ढंग से गठबंधन किया गया हो)। क्यों लंबे समय तक परमाणु होने के लिए निर्दिष्ट नहीं हैं - इसमें 32 बिट आर्किटेक्चर शामिल होंगे और परमाणु लेखन प्राप्त करने के लिए और अधिक महंगा हो सकता है जबकि 32 बिट सिस्टन पर संदर्भ केवल 32 बिट चौड़े हैं। – bestsss

7

यह परमाणु है।

हालांकि, उदाहरण आपके द्वारा दिया गया है, shared के मूल्य null की एक, a या hello world necessarly नहीं है। यह संभव है कि, उचित सिंक्रनाइज़ेशन के बिना, प्रत्येक थ्रेड अन्य धागे द्वारा निर्धारित मूल्य को कभी नहीं देख पाएगा। तो thread 1 देखेंगे a और thread 2 एक ही समय में hello world देखेंगे।

संपादित करें: आगे

JLS अलग धागे द्वारा किया आपरेशन के आदेश बताते हैं, पढ़ने Chapter 17 - Threads and Locks में के लिए अंतिम अनुच्छेद के लिए जोड़ा संदर्भ। विशेष रूप से, 17.4.5 Happens-before Order अनुभाग में। इसके अलावा, अच्छी तरह से लिखित Java Concurrency in Practice यह सब अच्छी तरह से बताता है।

+2

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

+2

@ डेविडस्वार्टज़ शब्द, "समय" शब्द का उपयोग किया जाता है क्योंकि इसका उपयोग हमारी दुनिया में किसी अन्य स्थान पर किया जाता है।इसका मतलब है कि आज सुबह 9: 00 बजे, 'थ्रेड 1' का मूल्य 'ए'' और 'थ्रेड 2' के साथ 'साझा' किया गया, इसे 'हैलो वर्ल्ड' के रूप में माना जाता है। मुझे नहीं लगता कि इससे उससे अधिक सरल हो जाता है। – yair

+0

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

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