2013-03-04 9 views
22

का उपयोग करें मेरे पास परमाणु संदर्भ के बारे में सरल सामान्य प्रश्न है।संदर्भ असाइनमेंट परमाणु है तो क्यों परमाणु संदर्भ

यदि संदर्भ असाइनमेंट जावा में परमाणु है तो परमाणु संदर्भ का उपयोग क्यों करें?

मैं यह भी पूछना चाहूंगा कि 64-बिट वीएम में संदर्भ आकलन परमाणु है या नहीं?

क्या हमें संदर्भ आकलन परमाणु होने के लिए अस्थिरता की आवश्यकता है? के रूप में juancn द्वारा टिप्पणी में विस्तार से बताया

उत्तर

18

मेरे पिछले जवाब है, गलत था:

कि Atomic* वर्गों और अस्थिर पहुँच के बीच का अंतर है। संदर्भ असाइनमेंट केवल इस अर्थ में परमाणु है कि कोई भी शब्द फाड़ नहीं सकता है, लेकिन कोई दृश्यता या पुनरावृत्ति गारंटी नहीं है। जावा सभी प्राचीन प्रकारों और संदर्भों के लिए इस प्रतिबंधित अर्थ में परमाणु लिखता है लेकिन लंबे/डबल के लिए नहीं (हालांकि 64 बिट वीएम में मुझे लगता है कि वे हमेशा परमाणु हैं)।

पिछला जवाब

यह मुख्य रूप से compareAndSet और getAndSet तरीकों के लिए, यह आवश्यक है। आप इसे अन्यथा नहीं कर सकते हैं (2 संचालन की आवश्यकता है)।

+2

+1 वास्तव में सभी 'परमाणु ...' कक्षाओं के लिए कारण नहीं है कि पुनर्क्रमित नहीं किया जा सकता। –

+1

@JimGarrison बिल्कुल नहीं। लंबे/फ्लोट/डबल असाइनमेंट परमाणु नहीं हैं। यह दो शब्दों को उस पते पर असाइन करेगा जो इसे मनमाने ढंग से आदेश में सौंपा गया है (आपको जावा मेमोरी मॉडल के बारे में जानकारी देखना होगा)। यदि आपके पास उस पते पर मूल्य लिखने के लिए प्रतिस्पर्धा करने वाले दो धागे हैं, तो आप एक शब्द प्राप्त कर सकते हैं जो थ्रेड 1 में उत्पन्न होता है, और उसके बाद दूसरा शब्द जो थ्रेड 2 में उत्पन्न होता है, जिसके परिणामस्वरूप एक कचरा मूल्य – searchengine27

+3

* मई * असाइन किया जा सकता है मनमाने ढंग से आदेश। कई हार्डवेयर प्लेटफ़ॉर्म 64-बिट शब्द चौड़ाई का समर्थन करते हैं। और उस नोट पर, यह केवल लंबे और डबल पर लागू होता है। फ्लोट नहीं, जो 32 बिट चौड़ा है। –

21

यदि संदर्भ असाइनमेंट जावा में परमाणु है तो परमाणु संदर्भ का उपयोग क्यों करें?

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

क्या हमें संदर्भ आकलन परमाणु होने के लिए अस्थिरता की आवश्यकता है?

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

+1

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

+0

+1। मुझे लगता है कि आपका जवाब बहुत अच्छा है, लेकिन यह प्रदर्शित करना बेहतर होगा कि आपके द्वारा दिए गए उदाहरण के लिए एटमिक रेफरेंस क्लास कैसे खेलती है। – nhahtdh

+0

इस लिंक को चेक करें: http://stackoverflow.com/questions/31042696/when-does-a-reference-need-to-be-atomic?noredirect=1&lq=1 –

2

कारण यह है कि संदर्भ परमाणु है, यह बहुत ही संकीर्ण अर्थ में परमाणु है।

एक धागा एक गैर अस्थिर संदर्भ लिखते हैं, तो क्या गारंटी है कि अन्य थ्रेड पूरे लिखने या नहीं देखेंगे यह बिल्कुल (कोई शब्द फाड़/कचरा) देखते हैं।

लेकिन किसी भी समय यह गारंटी नहीं है कि कोई अन्य धागा कभी भी इसे देखेगा और न ही वे उसी क्रम में देखे जाएंगे।

एक AtomicReference बहुत मजबूत गारंटी प्रदान करता है (कैस संचालन के अलावा), अनिवार्य रूप से वे अस्थिर की तरह व्यवहार:

  • किसी भी लिखते हैं कि एक अस्थिर लिखने से पहले धागा एक में हुआ बाद में एक अस्थिर पढ़ने के बाद धागा बी में दिखाई दे रहे हैं उस चर
  • अस्थिर आपरेशन के
संबंधित मुद्दे