मान लें कि आप पृष्ठभूमि कतार में इस myID
ऑब्जेक्ट के साथ बातचीत को सिंक्रनाइज़ करने का प्रयास कर रहे हैं, तो आप इसे प्रेषित ब्लॉक के अंदर लॉक के आसपास दूसरी तरफ चाहते हैं। अभी आपके पास:
@synchronized(myID) {
dispatch_async(queue, ^{
// do stuff with myID
});
}
अपने कतार में भेजा ब्लॉक जोड़ने की प्रक्रिया को सिंक्रनाइज़ है कि है, लेकिन करता है नहीं सिंक्रनाइज़ क्या आप पृष्ठभूमि में कर रहे हैं। मुझे संदेह है कि आपका मतलब क्या नहीं है।
आप शायद इरादा:
dispatch_async(queue, ^{
@synchronized(myID) {
// do stuff with myID
}
});
यह बहुत समान दिखता है, लेकिन एक पूरी तरह से अलग व्यवहार में परिणाम है। अब, पृष्ठभूमि कतार में भेजा गया कार्य सिंक्रनाइज़ किया जा रहा है।
एक और शोधन के रूप में, अगर यह भेजा ब्लॉक संभवतः धीमी है (और मैं यह हो सकता है ग्रहण), तो आप शायद जितना संभव हो उतना @synchronized
ब्लॉक विवश करना चाहते हैं:
dispatch_async(queue, ^{
// do slow stuff in preparation for interacting with `myID`
@synchronized(myID) {
// quickly do stuff with myID
}
// do anything else here
});
आप तो @synchronized
ब्लॉक के भीतर सभी पृष्ठभूमि ब्लॉक करें, आप पृष्ठभूमि को प्रेषित करने के लिए पूरे उद्देश्य को हरा सकते हैं, अर्थात् मुख्य कतार पर प्रभाव को कम करने के लिए। यह अंतिम प्रतिपादन उस समस्या को कम करता है।
अंतिम अवलोकन के रूप में, यदि आपके पास एक धारावाहिक कतार है (या एक गैर-वैश्विक समवर्ती कतार जिसमें आप बाधा के साथ अपडेट करते हैं), जिसे अक्सर ऐसी तकनीक के रूप में उपयोग किया जाता है जो ताले की पूरी तरह से आवश्यकता को समाप्त करता है, जब तक myID
के लिए सभी अपडेट और पूछताछ उस कतार में प्रेषित की जाती हैं। Concurrency प्रोग्रामिंग गाइड में Eliminating Lock-Based Code देखें।
आप क्या हासिल करने की कोशिश कर रहे हैं? – Wain
बीटीडब्लू, क्या मैं यह मानने में सही हूं कि आप किसी भी समय 'myID' को पुनर्स्थापित नहीं कर रहे हैं? '@ सिंक्रनाइज़ किया गया 'ब्लॉक' myID' द्वारा इंगित ऑब्जेक्ट के उस विशेष उदाहरण के लिए अद्वितीय है, सामान्य रूप से चर नहीं। – Rob