यहां एक उदाहरण दिया गया है, क्योंकि एक उदाहरण अक्सर एक लंबी व्याख्या की तुलना में स्पष्ट होता है। मान लीजिए foo
कि एक प्रकार का चर है long
। निम्नलिखित ऑपरेशन परमाणु ऑपरेशन नहीं है:
foo = 65465498L;
दरअसल, चर को दो अलग-अलग ऑपरेशनों का उपयोग करके लिखा गया है: एक जो पहले 32 बिट्स को लिखता है, और दूसरा वह जो पिछले 32 बिट्स को लिखता है। इसका मतलब है कि एक और सूत्र के मूल्य को पढ़ सकते हैं foo
, और मध्यवर्ती स्थिति देख सकते हैं।
ऑपरेशन को परमाणु बनाना, यह सुनिश्चित करने के लिए कि किसी अन्य धागे से, एकल, परमाणु (भागों में विभाजन योग्य नहीं) के रूप में ऑपरेशन को देखा जाता है, ऑपरेशन को सिंक्रनाइज़ेशन तंत्र का उपयोग करना शामिल है। इसका मतलब है कि किसी भी अन्य धागे, एक बार ऑपरेशन को परमाणु बना दिया जाता है, या तो foo
असाइनमेंट से पहले या असाइनमेंट के बाद का मूल्य देखेंगे । लेकिन मध्यवर्ती मूल्य कभी नहीं।
ऐसा करने का एक सरल तरीका यह है कि परिवर्तनशील को अस्थिर बनाया जाए :
private volatile long foo;
या चर तक हर पहुंच को सिंक्रनाइज़ करने के लिए:
public synchronized void setFoo(long value) {
this.foo = value;
}
public synchronized long getFoo() {
return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized
या इसे एक के साथ बदलने के लिए AtomicLong
:
private AtomicLong foo;