मैंने सिर्फ एक सिंगलटन विधि बनाई है, और मैं यह जानना चाहूंगा कि फ़ंक्शन क्या @synchronized()
करता है, जैसा कि मैं इसे अक्सर उपयोग करता हूं, लेकिन इसका अर्थ नहीं जानता।
जवाबों:
यह कोड ब्लॉक के चारों ओर एक महत्वपूर्ण खंड घोषित करता है । मल्टीथ्रेड कोड में, @synchronized
गारंटी देता है कि किसी भी समय ब्लॉक में केवल एक धागा उस कोड को निष्पादित कर सकता है।
यदि आपको यह पता नहीं है कि यह क्या करता है, तो आपका एप्लिकेशन शायद मल्टीथ्रेडेड नहीं है, और आपको संभवतः इसका उपयोग करने की आवश्यकता नहीं है (खासकर यदि सिंगलटन थ्रेड-सुरक्षित नहीं है)।
संपादित करें: 2011 से मूल उत्तर में नहीं थी कुछ और जानकारी जोड़ना।
@synchronized
निर्देश है कि एक के द्वारा संरक्षित है कोड के किसी भी क्षेत्र में प्रवेश करने से एक से अधिक थ्रेड से बचाता @synchronized
निर्देश एक ही वस्तु की चर्चा करते हुए । @synchronized
निर्देश को पारित वस्तु "ताला" के रूप में उपयोग की जाने वाली वस्तु है। दो धागे कोड के एक ही संरक्षित क्षेत्र में हो सकते हैं यदि किसी अलग ऑब्जेक्ट को लॉक के रूप में उपयोग किया जाता है, और आप लॉक के रूप में एक ही ऑब्जेक्ट का उपयोग करके कोड के दो पूरी तरह से अलग-अलग क्षेत्रों की रखवाली भी कर सकते हैं।
इसके अलावा, यदि आप nil
लॉक ऑब्जेक्ट के रूप में पास होते हैं, तो कोई भी लॉक नहीं लिया जाएगा।
@synchronized
।
यहाँ और यहाँ Apple दस्तावेज़ से :
ऑब्जेक्टिव-सी कोड में मक्खी पर म्यूटेक्स ताले बनाने के लिए @synchronized निर्देश एक सुविधाजनक तरीका है। @Synchronized निर्देश वही करता है जो कोई अन्य म्यूटेक्स लॉक करता है - यह अलग-अलग थ्रेड्स को एक ही समय में एक ही लॉक प्राप्त करने से रोकता है।
प्रलेखन इस विषय पर जानकारी का खजाना प्रदान करता है। यह इसके माध्यम से पढ़ने के लिए समय लेने के लायक है, विशेष रूप से यह देखते हुए कि आप इसका उपयोग कर रहे हैं बिना यह जाने कि यह क्या कर रहा है।
@synchronized
निर्देश एक सुविधाजनक तरीके से मक्खी पर म्युटेक्स ताले बनाने के लिए है ऑब्जेक्टिव-सी कोड।
@synchronized
निर्देश किसी अन्य म्युटेक्स ताला करते-यह होगा क्या करता है एक ही समय में एक ही ताला प्राप्त करने से अलग धागे से बचाता है।
वाक्य - विन्यास:
@synchronized(key)
{
// thread-safe code
}
उदाहरण:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
अब उपरोक्त कोड पूरी तरह से थ्रेड सुरक्षित है..अब एकाधिक थ्रेड्स मान बदल सकते हैं।
ऊपर सिर्फ एक अस्पष्ट उदाहरण है ...
@synchronized(val, oldValue) { ... }
?
@synchronized block आपके लिए लॉकिंग और अनलॉकिंग को स्वचालित रूप से हैंडल करता है । @synchronize आपके पास एक अंतर्निहित लॉक है जो उस वस्तु से जुड़ा हुआ है जिसे आप सिंक्रनाइज़ करने के लिए उपयोग कर रहे हैं। यहाँ इस विषय पर बहुत जानकारीपूर्ण चर्चा है कृपया अनुसरण करें- Objective-C में @synchronized लॉक / अनलॉक कैसे करें?
यहाँ उत्कृष्ट उत्तर:
सिंगलटन को लौटाने वाली कक्षा पद्धति को समझने में मदद करें
एक एकल बनाने की प्रक्रिया के आगे स्पष्टीकरण के साथ।
@synchronized
है thread safe
तंत्र। इस फ़ंक्शन के अंदर लिखे गए कोड का टुकड़ा, का हिस्सा बन जाता है critical section
, जिसमें एक समय में केवल एक धागा निष्पादित हो सकता है।
@synchronize
लॉक को NSLock
स्पष्ट रूप से लागू करता है जबकि इसे स्पष्ट रूप से लागू करता है।
यह केवल थ्रेड सुरक्षा का आश्वासन देता है, इसकी गारंटी नहीं देता है। मेरा मतलब है कि आप कार के लिए एक विशेषज्ञ ड्राइवर को किराए पर लेते हैं, फिर भी यह गारंटी नहीं देता है कि कार दुर्घटना से नहीं मिलेगी। हालाँकि संभावना थोड़ी ही रहती है।
@synchronized
तो यह कुछ नहीं करता है - आप असुरक्षित रह गए हैं। 2)@synchronized
है धीमी गति से ।