2013-03-17 10 views
7

मैंने पढ़ा कि जावा अस्थिर अनुक्रमिक संगत है लेकिन परमाणु नहीं है। परमाणुता जावा विभिन्न पुस्तकालय प्रदान करता है।अनुक्रमिक स्थिरता और परमाणुता के बीच क्या अंतर है?

क्या कोई साधारण अंग्रेजी में दो के बीच अंतर समझा सकता है?

(मेरा मानना ​​है कि सवाल गुंजाइश C/C++ में शामिल हैं और इसलिए उन भाषा टैग जोड़ने बड़ा दर्शकों के लिए।)

+0

मुझे नहीं लगता कि 'अस्थिर' जावा में सी/सी ++ में समान गारंटी प्रदान करता है। विशेष रूप से, मुझे नहीं लगता कि यह सी में प्रदान करता है जिसे आप अनुक्रमिक स्थिरता कहते हैं (यानी कि स्मृति बाड़ अन्य चर पर लागू होती है) - टीबीसी। – assylias

+1

@ वासिलियास का मतलब यह नहीं था कि अस्थिर का सी/सी ++ में समान अर्थ है। मुझे यकीन है कि यह नहीं करता है।मैं 'अनुक्रमिक स्थिरता और परमाणुता' की अवधारणा का जिक्र कर रहा था जो सी/सी ++ और जावा के बीच आम है। सी/सी ++ अस्थिर कीवर्ड में परिवर्तनीय उपयोग के अनुकूलन को रोकता है और अस्थिर चर के साथ ऑपरेशन से पहले निर्दिष्ट किए गए संचालन के बीच अनुक्रमिक-स्थिरता बनाए रखने के लिए उपयोग नहीं किया जाता है .. –

उत्तर

7

एक कक्षा में उन दो चर कल्पना कीजिए:

int i = 0; 
volatile int v = 0; 

और उन दो तरीकों

void write() { 
    i = 5; 
    v = 2; 
} 

void read() { 
    if (v == 2) { System.out.println(i); } 
} 

अस्थिर अर्थ विज्ञान गारंटी देते हैं कि read जाएगा या तो प्रिंट 5 या कुछ भी नहीं (यह मानते हुए कोई अन्य तरीकों को संशोधित कर रहे पाठ्यक्रम के क्षेत्र)। यदि v अस्थिर नहीं थे, read भी 0 प्रिंट कर सकते हैं क्योंकि i = 5 और v = 2 को फिर से व्यवस्थित किया जा सकता था। मुझे लगता है कि अनुक्रमिक स्थिरता से आपका मतलब है, जिसका व्यापक अर्थ है।

दूसरी ओर, अस्थिरता परमाणुता की गारंटी नहीं देता है। तो दो धागे इस विधि समवर्ती कॉल करते हैं (v ही volatile int है):

load v; 
increment v; 
store v; 
:

void increment() { 
    v++; 
} 

आप कोई गारंटी नहीं कि v 2. द्वारा बढ़ा दी जाएगी इसका कारण यह है v++ वास्तव में तीन बयान है

और थ्रेड इंटरलीविंग वी के कारण केवल एक बार बढ़ाया जा सकता है (दोनों थ्रेड एक ही मान लोड करेंगे)।

+0

यदि आप एक उदाहरण जोड़ सकते हैं तो यह पूर्ण जवाब होगा जो परमाणु और अनुक्रमिक कुछ प्रदर्शित करेगा। क्या हम mutex का उपयोग किए बिना ऐसा कर सकते हैं? –

+1

अभी अपडेट नहीं किया जा सकता है लेकिन हां, इसलिए cslled लॉक मुक्त एल्गोरिदम परमाणुता प्रदान करने के लिए सीएएस संचालन का उपयोग करें। इसका उपयोग जावा में सभी परमाणु XXX वर्गों द्वारा किया जाता है। – assylias

5

मान लीजिए आप इन दो चर है:

public int a = 0; 
public volatile int b = 0; 

और लगता है एक धागा

करता है
a = 1; 
b = 2; 

एक और धागा इन मूल्यों को पढ़ता है और देखता है कि == 2 ख है, तो यह भी एक == देखने के लिए गारंटी है तो 1.

लेकिन पढ़ने धागा a == 1 और b == 0 देख सकता था, क्योंकि दो राईट एक परमाणु आपरेशन का हिस्सा नहीं हैं, इसलिए पढ़ने धागा a के लिए किए गए परिवर्तन देख सकते हैं इससे पहले कि पहले धागा b को एक मान निर्दिष्ट किया है।

इन दो राईट परमाणु बनाने के लिए, आप इन दो चर के लिए उपयोग सिंक्रनाइज़ करने के लिए की आवश्यकता होगी:

synchronized (lock) { 
    a = 1; 
    b = 2; 
} 

... 

synchronized (lock) { 
    System.out.println("a = " + a + "; b = " + b); 
} 

और इस मामले में, पढ़ने धागा a == 0 और b == 0, या a == 1 और b == 2 देखेंगे, लेकिन कभी मध्यवर्ती राज्य नहीं।

+2

+1, लेकिन आप वास्तव में यह नहीं कह रहे हैं "यह अनुक्रमिक है स्थिरता "और" यह परमाणु है "। – Dukeling

+0

हाँ, मुझे लगता है कि यह स्पष्ट था। लेकिन assylias जवाब वैसे भी मेरे से स्पष्ट और बेहतर है। –

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