2008-11-11 12 views

उत्तर

89

कम जवाब है: नहीं

java.util.concurrent.atomic package doc से:

पहुंच और एटोमिक्स के अपडेट के लिए स्मृति प्रभाव आम तौर पर वाष्पशील के लिए नियमों का पालन करें:

  • get मेमोरी है volatile चर पढ़ने के प्रभाव।
  • set में volatile चर लिखने (असाइनिंग) के स्मृति प्रभाव हैं।

तरह से, पैकेज के लिए डॉक बहुत अच्छा है और सब कुछ समझाया गया है द्वारा ...


lazySet (जावा 6 में प्रस्तुत) एक नए शुरू की आपरेशन पहुंच से बाहर का अर्थ विज्ञान है कि volatile चर के माध्यम से; अधिक जानकारी के लिए this post देखें।

+2

और लंबा उत्तर होगा? –

+0

सहमत हुए। हमें कम से कम एक लिंक चाहिए। –

+2

लंबे उत्तर का लिंक: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/package-summary.html –

37

नहीं, ऐसा नहीं है।

परमाणु संदर्भ द्वारा प्रदान की गई अतिरिक्त शक्ति तुलना एंडसेट() विधि और दोस्तों है। यदि आपको उन तरीकों की आवश्यकता नहीं है, तो एक अस्थिर संदर्भ समान अर्थशास्त्र को AtomicReference.set() और .get() के रूप में प्रदान करता है।

3

परमाणु संदर्भ अतिरिक्त कार्यक्षमता प्रदान करता है जो एक सादा अस्थिर चर प्रदान नहीं करता है। जैसा कि आपने एपीआई पढ़ा है, आपको यह पता चलेगा, लेकिन यह एक लॉक भी प्रदान करता है जो कुछ परिचालनों के लिए उपयोगी हो सकता है।

हालांकि, जब तक आपको यह अतिरिक्त कार्यक्षमता की आवश्यकता नहीं है, तो मेरा सुझाव है कि आप एक सादा अस्थिर क्षेत्र का उपयोग करें।

+0

तो अंतर, फिर, में है उनका प्रदर्शन। यदि कोई अंतर नहीं था, तो आप कभी भी एक दूसरे का उपयोग करने का सुझाव नहीं देंगे। –

+0

प्रदर्शन काफी समान है। एक परमाणु रिफ्रेंस जटिलता और स्मृति उपयोग जोड़ता है। –

+0

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

6

JDK source code इस तरह के भ्रम का जवाब देने के सर्वोत्तम तरीकों में से एक है। यदि आप AtomicReference में कोड देखते हैं, तो यह ऑब्जेक्ट स्टोरेज के लिए एक वॉलेट चर का उपयोग करता है।

private volatile V value; 

तो, जाहिर है, अगर तुम सिर्फ AtomicReference पर सेट() प्राप्त() और उपयोग करने के लिए जा रहे हैं यह एक अस्थिर चर का उपयोग कर की तरह है। लेकिन जैसा कि अन्य पाठकों ने टिप्पणी की, परमाणु संदर्भ अतिरिक्त सीएएस अर्थशास्त्र प्रदान करता है। तो, पहले तय करें कि क्या आप सीएएस अर्थशास्त्र चाहते हैं या नहीं, और यदि आप केवल तब ही परमाणु संदर्भ का उपयोग करते हैं।

+8

* "जेडीके स्रोत कोड इस तरह के भ्रम का जवाब देने के सर्वोत्तम तरीकों में से एक है" * => मैं जरूरी नहीं है - जावडोक (जो कक्षा का अनुबंध है) सबसे अच्छा तरीका है। कोड में आपको जो मिलता है वह एक विशिष्ट कार्यान्वयन के लिए प्रश्न का उत्तर देता है लेकिन कोड बदल सकता है। – assylias

+3

उदाहरण के लिए [यह चर] [http://stackoverflow.com/a/14363501/829571) हैशैप में जेडीके 6 में अस्थिर था लेकिन जावा 7 में अब अस्थिर नहीं है। क्या आपने इस तथ्य पर अपना कोड आधारित किया है कि चर अस्थिर था, यह आपके जेडीके को उतारने पर टूट गया होगा ... माना जाता है कि उदाहरण अलग है लेकिन आपको बिंदु मिल गया है। – assylias

1

कई मतभेद और समझौते के होते हैं:

  1. एक अस्थिर क्षेत्र के रूप में एक AtomicReference प्राप्त/सेट एक ही झामुमो अर्थ विज्ञान का प्रयोग किया है (जावाडोक राज्यों के रूप में), लेकिन AtomicReference एक के चारों ओर एक आवरण है संदर्भ, इसलिए फ़ील्ड में किसी भी पहुंच में एक और पॉइंटर पीछा शामिल है।

  2. स्मृति पदचिह्न (एक संपीड़ित उफ़ वातावरण है, जो सबसे के लिए सच है VMs कल्पना करते हुए) गुणा किया जाता है:

    • अस्थिर रेफरी = 4 बी
    • AtomicReference = 4 बी + 16b (12b वस्तु हैडर + 4 बी रेफ फील्ड)
  3. AtomicReference एक अस्थिर संदर्भ से एक समृद्ध एपीआई प्रदान करता है। आप AtomicFieldUpdater, या जावा 9 के साथ VarHandle का उपयोग कर अस्थिर संदर्भ के लिए एपीआई प्राप्त कर सकते हैं। यदि आप कैंची के साथ चलना पसंद करते हैं तो आप सीधे sun.misc.Unsafe तक पहुंच सकते हैं। AtomicReference स्वयं Unsafe का उपयोग कर लागू किया गया है।

    • केवल जरूरत/तैयार हो जाओ:

तो, जब यह अच्छा एक दूसरे के ऊपर का चयन करने के लिए है? एक अस्थिर क्षेत्र, सरल समाधान और सबसे ऊपरी ओवरहेड के साथ चिपकाएं।

  • अतिरिक्त कार्यक्षमता की आवश्यकता है? यदि यह आपके कोड का एक संवेदनशील भाग (गति/स्मृति ओवरहेड) है, तो AtomicReference/AtomicFieldUpdater/Unsafe के बीच एक विकल्प बनाएं जहां आप अपने प्रदर्शन लाभ के लिए पठनीयता और जोखिम में भुगतान करते हैं। यदि यह संवेदनशील क्षेत्र नहीं है तो बस AtomicReference पर जाएं। लाइब्रेरी लेखकों आमतौर पर लक्षित जेडीके, अपेक्षित एपीआई प्रतिबंध, स्मृति बाधाओं आदि के आधार पर इन तरीकों का मिश्रण उपयोग करते हैं।
  • संबंधित मुद्दे