आप पहले उदाहरण में संदर्भ को प्रारंभ नहीं किया, यह शायद होना चाहिए:
public class Internet {
AtomicReference<String> address = new AtomicReference<String>();
public String getAddress(){
String s = address.get();
return s == null ? null : s.toString();
}
public void setAddress(String address) {
this.address.set(address);
}
}
कहाँ पहुँच प्रतिबंध स्थित है महत्वपूर्ण है। यदि आप उस ऑब्जेक्ट के भीतर नियंत्रण डालते हैं तो उसके आविष्कारों का एकमात्र नियंत्रण हो सकता है, जो धागे पर भरोसा करने से बहुत कम नाजुक है, ठीक से सिंक्रनाइज़ करने के लिए, जहां थ्रेड तक पहुंचने वाला एक बुरी तरह व्यवहार किया जाता है, उस चीज़ को भ्रष्ट कर सकते हैं। तो पहला उदाहरण उस खाते पर बहुत बेहतर है।
ताकि वस्तु का अपना ताला पर नियंत्रण है (इसलिए यह तो सुरक्षित रूप से करने के लिए उस तक पहुंचने में धागे पर भरोसा नहीं है) इस तरह, आप दूसरे उदाहरण को बदलते हैं:
public class Internet {
private final Object lock = new Object();
private String s;
public String getAddress() {
synchronized(lock) {
return s;
}
}
public void setAddress(String s) {
synchronized(lock) {
this.s = s;
}
}
}
तो यह करीब है तुलना, एक लॉकिंग पर निर्भर करता है और दूसरा परमाणु संदर्भों पर निर्भर करता है। AtomicReference का उपयोग करने वाला एक मशीन-स्तर परमाणु प्रसंस्करण निर्देशों का उपयोग करके लॉकिंग से बचने का प्रयास करता है। जो तेज़ है, वह आपके हार्डवेयर और जेवीएम और प्रोसेसिंग लोड पर निर्भर हो सकता है, आमतौर पर परमाणु दृष्टिकोण तेज होना चाहिए। सिंक्रनाइज़ दृष्टिकोण एक और सामान्य उद्देश्य तंत्र है; सिंक्रनाइज़ किए गए ब्लॉक के साथ आप एकाधिक असाइनमेंट को एक साथ आसानी से समूहित कर सकते हैं, जहां परमाणु संदर्भों के साथ यह अधिक शामिल है।
As James says in his answer, सिंक्रनाइज़ेशन के साथ आपके थ्रेड लॉक की प्रतीक्षा कर रहे हैं; कोई टाइमआउट नहीं है, और डेडलॉक संभव है। परमाणु संदर्भ के साथ धागा एक साझा लॉक पर इंतजार के साथ अपना परिवर्तन करता है।
लागू करने के लिए इस ताकि आप सभी लॉकिंग, व्यस्त-प्रतीक्षा, और कैश अद्यतन करने से बच जाएंगे, ताकि आप वस्तु अपरिवर्तनीय बना सकते हैं अपने कोड का आयोजन किया जाएगा सबसे आसान और सबसे अच्छा प्रदर्शन रास्ता:
public final class Internet {
private final String s;
public Internet(String s) {
this.s = s;
}
public String getAddress() {return s;}
}
वरीयता के अवरोही क्रम में:
- जब भी संभव हो अपरिवर्तनीयता पसंद करते हैं।
- कोड के लिए जो अपरिवर्तनीय नहीं हो सकता है, उत्परिवर्तन को थ्रेड में सीमित करने का प्रयास करें।
- यदि धागे में केवल एक चीज बदलनी है, तो परमाणु दृष्टिकोण का उपयोग करें।
- यदि धागे में कई परिवर्तनों को एक साथ अन्य थ्रेडों द्वारा निर्विवाद होने की आवश्यकता है, तो लॉकिंग का उपयोग करें।
यह वही है, अगर आप यही पूछ रहे हैं। Concurrency मॉडल अलग है। –
http://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html देखें "इस सरल वर्ग के लिए, सिंक्रनाइज़ेशन एक स्वीकार्य समाधान है। लेकिन अधिक जटिल कक्षा के लिए, हम लायन प्रभाव से बचना चाहेंगे अनावश्यक सिंक्रनाइज़ेशन का। " ऊपर के रूप में, कार्यात्मक रूप से वे वही हैं। – jdv