2012-05-08 20 views
9
@property (atomic, retain) NSArray *array; 

मैं एक सेटर और सरणी के गेटर को ओवरराइड नहीं करता हूं। मैं @ सिंक्रनाइज़ (सरणी) {} या @ सिंक्रनाइज़ (self.array) {} का उपयोग कर सकता हूं। जैसा कि मुझे पता है कि सभी मामले सही हैं, क्या मैं सही हूँ?@ सिंक्रनाइज़ का उपयोग करने का सही तरीका कौन सा है?

उत्तर

9

जैसा कि आपने प्रश्न का वाक्यांश दिया है, दोनों कथन समवर्ती सुरक्षा रणनीति के मामले के बराबर हैं।

पैमाने पर निर्भर करता है और आपने अपनी परियोजना पर कितना काम पूरा कर लिया है, तो आप थ्रेड-सुरक्षा के लिए एक वैकल्पिक रणनीति पर विचार करना चाहेंगे।

हाल ही में, ऐप्पल ने परंपरागत अवरोध के बजाय थ्रेड-सुरक्षा-द्वारा-क्रमबद्धरण की सिफारिश करने का एक बिंदु बना दिया है। संक्षेप में, विवाद बढ़ने के साथ, धारावाहिक पहुंच @ सिंक्रनाइज़ेशन के साथ अवरुद्ध करने से कहीं अधिक कुशल है।

सिंक्रनाइज़ करने के बजाय, एक जीसीडी धारावाहिक कतार स्थापित करने और धागे में साझा संसाधनों तक पहुंच को बढ़ाने पर विचार करें।

+0

या, बेहतर, रीडर-लेखक पैटर्न, एक जीसीडी समवर्ती कतार का उपयोग करें, 'dispatch_sync' के साथ पढ़ता है और 'dispatch_barrier_async' के साथ लिखता है। – Rob

10

@syncrhonized(obj) का उपयोग करके बस एक ताला बना देता है ताकि obj पर सिंक्रनाइज़ करने वाला अन्य कोड एक ही समय में निष्पादित नहीं होगा।

परमाणु गुण एक संपत्ति का उपयोग होने पर परिवर्तन की अनुमति नहीं देकर काम करते हैं; वे तक पहुंच के लिए अंतर्निहित लॉकिंग प्रदान करते हैं।

array = someObject.array; //locked 
[array doSomething];  //no longer locked 

आप atomic संपत्तियों के लिए getters और setters ओवरराइड नहीं कर सकते, लेकिन गेटर आसपास @sycnronized निर्देशों का उपयोग/सेटर पर्याप्त होना चाहिए।

@synthesize array=_array; 

... 

-(void)setArray 
{ 
    @synchronized(self) 
    { 
     _array = array; 
    } 
} 

-(NSArray *)array 
{ 
    NSArray *retVal; 

    @synchronized(self) 
    { 
     retVal = _array; 
    } 

    return retVal; 
} 

ईमानदारी से, जब तक आप कुछ गंभीरता से बहु प्रोग्रामिंग कर रहे हैं, परमाणु गुण अनावश्यक हैं और सिर्फ प्रदर्शन हिट होता है।

+1

स्पष्ट रूप से, उदाहरण के लिए 'सिंक्रनाइज़' नामक गेटर्स और सेटर्स थ्रेड-सुरक्षा से बहुत रोते हैं और इस प्रकार कोई भी इस पैटर्न को लगभग कभी लागू नहीं करेगा। थ्रेड-सुरक्षा को समझने के लिए अक्सर एक उच्च स्तर पर सिंक्रनाइज़ेशन करना होता है। – Rob

संबंधित मुद्दे