ObjC गुण के लिए - न तो धागा सुरक्षित हैं।
परमाणु प्रतिरोधी थ्रेडिंग त्रुटियों के लिए है। कुल मिलाकर, यह एक उत्सुक डिफ़ॉल्ट है। जिन परिदृश्यों पर आप परमाणु पक्षपात करेंगे वे बहुत कम हैं। परमाणु शुद्धता की संभावना को बढ़ा सकता है, लेकिन यह बहुत कम स्तर पर उचित लॉकिंग तंत्र के लिए एक विकल्प माना जा सकता है। इसलिए, यदि आपको थ्रेड सुरक्षा की आवश्यकता है, तो आपको अभी भी परमाणु पढ़ने/लिखने के शीर्ष पर कुछ अन्य सिंक्रनाइज़ेशन आदिम की आवश्यकता है। यदि आपको थ्रेड सुरक्षा की आवश्यकता नहीं है (उदा। उदाहरण अपरिवर्तनीय है या केवल मुख्य धागे से चलने का इरादा है), परमाणु कुछ भी नहीं जोड़ देगा।
प्रतिरोधी थ्रेडिंग त्रुटियों के लिए 'गुणवत्ता' नहीं है - यह वास्तविक थ्रेडिंग त्रुटियों को मुखौटा करने में मदद करता है और उन्हें पुन: पेश करने और पहचानने में अधिक कठिन बना देता है।
यह भी ध्यान दें कि उत्परिवर्तनीय बनाम अपरिवर्तनीय प्रकार वास्तव में थ्रेडसफ्टी की गारंटी नहीं देते हैं।'म्यूटेबल' का उपयोग ओबीजेसी नामों में केवल इंटरफ़ेस को संदर्भित करने के लिए किया जा सकता है - एक अपरिवर्तनीय उदाहरण के आंतरिक में वास्तव में आंतरिक परिवर्तनीय स्थिति हो सकती है। संक्षेप में, आप यह नहीं मान सकते कि एक प्रकार जिसमें एक परिवर्तनीय उपclass है थ्रेड सुरक्षित है।
प्रश्न विस्तारित: धागा ए, कॉल:
मान लीजिए एक परमाणु स्ट्रिंग संपत्ति "नाम" कहा जाता है, और यदि आप [@ 'ए' आत्म setName] फोन [स्वयं सेटनाम: @ "बी"] थ्रेड बी से, और थ्रेड सी से [स्वयं नाम] कॉल करें, फिर विभिन्न धागे पर सभी ऑपरेशन क्रमशः किया जाएगा जिसका अर्थ है कि अगर एक थ्रेड सेटटर या गेटर निष्पादित कर रहा है, तो अन्य थ्रेड इंतजार करेंगे।
यदि सभी धागे एक ही समय में संपत्ति को पढ़ने और/या लिखने की कोशिश करते हैं, तो केवल एक थ्रेड में एक समय तक पहुंच होगी और अन्य को अवरुद्ध कर दिया जाएगा यदि संपत्ति परमाणु थे। अगर संपत्ति nonatomic थे, तो वे सभी एक ही "समय" पर परिवर्तनीय को पढ़ने और लिखने के लिए अनजान होगा।
यदि कोई अन्य थ्रेड डी कॉल [नाम रिलीज] एक साथ होता है तो यह ऑपरेशन क्रैश उत्पन्न कर सकता है क्योंकि यहां कोई सेटटर/गेटर कॉल शामिल नहीं है।
सही।
जिसका अर्थ है कि कोई ऑब्जेक्ट पढ़ा/लिखना सुरक्षित है (एटीओएमआईसी) लेकिन थ्रेड सुरक्षित नहीं है क्योंकि एक और धागे ऑब्जेक्ट को किसी भी प्रकार के संदेश भेज सकते हैं।
ठीक है, इसके लिए वास्तव में बहुत कुछ है। सामान्य उदाहरण है:
@interface MONPerson : NSObject
@property (copy) NSString * firstName;
@property (copy) NSString * lastName;
- (NSString *)fullName;
@end
परमाणु, या nonatomic, आप अगर एक धागा कि उदाहरण से पढ़ रही है और एक अन्य इसे करने के लिए लिख रहे हैं (उदाहरण के लिए ताला) एक तुल्यकालन तंत्र की आवश्यकता होगी। आप एक MONPerson के firstName के साथ खत्म हो सकता है और एक अन्य lastName है - पहले गेटर द्वारा दिया गया मान भी आप के लिए दिया जाता है वस्तु बदल गया हो, या ऐसा कर सकते हैं:
थ्रेड एक:
p.firstName = @"Rob";
थ्रेड बी :
p.firstName = @"Robert";
थ्रेड एक:
label.string = p.firstName; // << uh, oh -- will be Robert
यदि संपत्ति "नाम" nonatomic था, तो उपर्युक्त उदाहरण में सभी धागे - ए, बी, सी और डी किसी भी अप्रत्याशित परिणाम के साथ-साथ निष्पादित निष्पादित करेंगे।
दाएं - प्रारंभिक लक्षण संदर्भ गणना असंतुलन (रिसाव, ओवर-रिलीज) हो सकते हैं।
परमाणु के मामले में, ए, बी या सी में से कोई भी पहले निष्पादित करेगा लेकिन डी अभी भी समानांतर में निष्पादित हो सकता है। कृपया इस पर टिप्पणी करें ....
सही।लेकिन यदि आप ऊपर दिए गए उदाहरण को देखते हैं - अकेले परमाणु लॉक के लिए शायद ही कोई उपयुक्त प्रतिस्थापन है। यह इस के बजाय की तरह लग रहे करने के लिए होगा:
थ्रेड एक:
[p lock]; // << wait for it… … … …
// Thread B now cannot access p
p.firstName = @"Rob";
NSString fullName = p.fullName;
[p unlock];
// Thread B can now access p
label.string = fullName;
थ्रेड बी:
[p lock]; // << wait for it… … … …
// Thread A now cannot access p
…
[p unlock];
परमाणु accessors से अधिक बीस बार nonatomic पहुंच की तुलना में धीमी औसत कर सकते हैं। साथ ही, यदि आपकी कक्षा को थ्रेडसेफ होना चाहिए और इसमें व्यवहार्य स्थिति हो, तो आप एक समवर्ती परिदृश्य में चलने पर लॉक का उपयोग कर अंततः समाप्त हो जाएंगे। उचित लॉकिंग आपको आवश्यक सभी गारंटी प्रदान करती है - परमाणु एक्सेसर्स उस परिदृश्य में अनावश्यक हैं, परमाणुओं का उपयोग केवल CPU समय जोड़ना होगा। नियमित लॉक के बारे में एक और अच्छी बात यह है कि आपके पास आवश्यक सभी ग्रैन्युलरिटी है - हालांकि यह अक्सर परमाणुओं के लिए उपयोग किए जाने वाले स्पिन लॉक से अधिक भारी होती है, लेकिन आपको आमतौर पर कम अधिग्रहण की आवश्यकता होती है, इसलिए यदि आप नियमित ताले का सही ढंग से उपयोग करते हैं तो यह बहुत तेजी से समाप्त होता है ।
http://www.google.com.ph/search?क्यू = उद्देश्य + सी + परमाणु + बनाम + nonatomic और aq = 0 और oq = उद्देश्य + सी + परमाणु + बनाम + गैर और sugexp = क्रोम, mod = 10 और स्रोत आईडी = क्रोम और यानी = यूटीएफ -8 – janusbalatbat