उद्देश्य सी में एक एकल विधि के रूप में @synchronized () क्या करता है?


87

मैंने सिर्फ एक सिंगलटन विधि बनाई है, और मैं यह जानना चाहूंगा कि फ़ंक्शन क्या @synchronized()करता है, जैसा कि मैं इसे अक्सर उपयोग करता हूं, लेकिन इसका अर्थ नहीं जानता।

जवाबों:


119

यह कोड ब्लॉक के चारों ओर एक महत्वपूर्ण खंड घोषित करता है । मल्टीथ्रेड कोड में, @synchronizedगारंटी देता है कि किसी भी समय ब्लॉक में केवल एक धागा उस कोड को निष्पादित कर सकता है।

यदि आपको यह पता नहीं है कि यह क्या करता है, तो आपका एप्लिकेशन शायद मल्टीथ्रेडेड नहीं है, और आपको संभवतः इसका उपयोग करने की आवश्यकता नहीं है (खासकर यदि सिंगलटन थ्रेड-सुरक्षित नहीं है)।


संपादित करें: 2011 से मूल उत्तर में नहीं थी कुछ और जानकारी जोड़ना।

@synchronizedनिर्देश है कि एक के द्वारा संरक्षित है कोड के किसी भी क्षेत्र में प्रवेश करने से एक से अधिक थ्रेड से बचाता @synchronizedनिर्देश एक ही वस्तु की चर्चा करते हुए@synchronizedनिर्देश को पारित वस्तु "ताला" के रूप में उपयोग की जाने वाली वस्तु है। दो धागे कोड के एक ही संरक्षित क्षेत्र में हो सकते हैं यदि किसी अलग ऑब्जेक्ट को लॉक के रूप में उपयोग किया जाता है, और आप लॉक के रूप में एक ही ऑब्जेक्ट का उपयोग करके कोड के दो पूरी तरह से अलग-अलग क्षेत्रों की रखवाली भी कर सकते हैं।

इसके अलावा, यदि आप nilलॉक ऑब्जेक्ट के रूप में पास होते हैं, तो कोई भी लॉक नहीं लिया जाएगा।


14
कुछ महत्वपूर्ण बिंदुओं: 1) यदि आप एक शून्य सूचक का उपयोग करते हैं @synchronizedतो यह कुछ नहीं करता है - आप असुरक्षित रह गए हैं। 2) @synchronizedहै धीमी गति से
हॉट लिप्स

यह उत्तर भ्रामक है, और स्वीकृत उत्तर नहीं होना चाहिए। यद्यपि यह जो कहता है वह कभी-कभी सही होगा (जब तक कि टोकन को सिंक्रोनाइज करने के लिए पारित किया गया है, सभी थ्रेड्स में एक ही वस्तु है), यह भ्रामक रूप से अधूरा है। सिंक्रनाइज़ एक ही समय में किसी भी संबंधित कोड अनुभाग को निष्पादित करने से रोकता है, न कि केवल "उस कोड को ब्लॉक में"। सिंक्रनाइज़ करने के लिए पैरामीटर प्रभावी रूप से निर्धारित करता है कि कोड के कोड (या "ब्लॉक" के रूप में उत्तर उन्हें कॉल करता है) समवर्ती पहुंच से सुरक्षित हैं।
अरदा

@ अरदा तुम एकदम सही हो। मैंने थोड़ी सी अधिक जानकारी और कुछ Apple प्रलेखन के बारे में लिंक जोड़ा है @synchronized
जॉन कैल्सबीक

@ जॉनकोल्सबीक, जवाब अब बहुत बेहतर लग रहा है। अंगूठे मुझसे।
अरदा

@HotLicks यह इंगित करने के लिए दिलचस्प है, लेकिन संक्षेप में कहना बेहतर होगा कि विकल्प क्या हो सकते हैं (लिंक?)
itMaxence

43

यहाँ और यहाँ Apple दस्तावेज़ से :

ऑब्जेक्टिव-सी कोड में मक्खी पर म्यूटेक्स ताले बनाने के लिए @synchronized निर्देश एक सुविधाजनक तरीका है। @Synchronized निर्देश वही करता है जो कोई अन्य म्यूटेक्स लॉक करता है - यह अलग-अलग थ्रेड्स को एक ही समय में एक ही लॉक प्राप्त करने से रोकता है।

प्रलेखन इस विषय पर जानकारी का खजाना प्रदान करता है। यह इसके माध्यम से पढ़ने के लिए समय लेने के लायक है, विशेष रूप से यह देखते हुए कि आप इसका उपयोग कर रहे हैं बिना यह जाने कि यह क्या कर रहा है।


26

@synchronizedनिर्देश एक सुविधाजनक तरीके से मक्खी पर म्युटेक्स ताले बनाने के लिए है ऑब्जेक्टिव-सी कोड।

@synchronizedनिर्देश किसी अन्य म्युटेक्स ताला करते-यह होगा क्या करता है एक ही समय में एक ही ताला प्राप्त करने से अलग धागे से बचाता है।

वाक्य - विन्यास:

 @synchronized(key) 
 { 
  // thread-safe code 
 }

उदाहरण:

 -(void)AppendExisting:(NSString*)val
{
  @synchronized (oldValue) {
      [oldValue stringByAppendingFormat:@"-%@",val];
  }
}

अब उपरोक्त कोड पूरी तरह से थ्रेड सुरक्षित है..अब एकाधिक थ्रेड्स मान बदल सकते हैं।

ऊपर सिर्फ एक अस्पष्ट उदाहरण है ...


3
क्या यह @synchronized (oldValue) नहीं होना चाहिए?
जोएल

या भी @synchronized(val, oldValue) { ... }?
वैलेंटाइन शेरिन

मुझे यकीन नहीं है कि मैंने कभी कोई योजना देखी है जो "पूरी तरह से सुरक्षित है"। बहुत कम से कम आपको यह जानने की ज़रूरत है कि आप क्या कर रहे हैं और कहीं से नेत्रहीन कॉपी कोड नहीं।
हॉट लिप्स

लेकिन मुझे लगता है कि उपरोक्त कोड सभी के बाद "पूरी तरह से सुरक्षित है", क्योंकि यह बिल्कुल कुछ भी नहीं करता है।
हॉट लिप्स

6

@synchronized block आपके लिए लॉकिंग और अनलॉकिंग को स्वचालित रूप से हैंडल करता है । @synchronize आपके पास एक अंतर्निहित लॉक है जो उस वस्तु से जुड़ा हुआ है जिसे आप सिंक्रनाइज़ करने के लिए उपयोग कर रहे हैं। यहाँ इस विषय पर बहुत जानकारीपूर्ण चर्चा है कृपया अनुसरण करें- Objective-C में @synchronized लॉक / अनलॉक कैसे करें?



-2

@synchronizedहै thread safeतंत्र। इस फ़ंक्शन के अंदर लिखे गए कोड का टुकड़ा, का हिस्सा बन जाता है critical section, जिसमें एक समय में केवल एक धागा निष्पादित हो सकता है।

@synchronizeलॉक को NSLockस्पष्ट रूप से लागू करता है जबकि इसे स्पष्ट रूप से लागू करता है।

यह केवल थ्रेड सुरक्षा का आश्वासन देता है, इसकी गारंटी नहीं देता है। मेरा मतलब है कि आप कार के लिए एक विशेषज्ञ ड्राइवर को किराए पर लेते हैं, फिर भी यह गारंटी नहीं देता है कि कार दुर्घटना से नहीं मिलेगी। हालाँकि संभावना थोड़ी ही रहती है।


2
यह बिलकुल गलत है। dispatch_once @syncrhonized के समान नहीं है, यह केवल एक सिंगलटन के आवंटन के तहत एक विकल्प हो सकता है।
जुगुटियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.