2010-06-07 19 views
5

मुझे एहसास हुआ कि स्मृति मॉडल के कारण जावा में डबल चेक लॉकिंग त्रुटिपूर्ण है, लेकिन यह आमतौर पर सिंगलटन पैटर्न के साथ जुड़ा हुआ है और सिंगलटन के निर्माण को अनुकूलित करता है।डबल चेक लॉकिंग - उद्देश्य सी

के बारे में क्या उद्देश्य-सी में इस मामले के तहत:

मैं अगर अपने आवेदन डेटा या नहीं स्ट्रीमिंग है निर्धारित करने के लिए एक बूलियन ध्वज है। मैं 3 तरीकों, startStreaming, stopStreaming, streamingDataReceived है और मैं का उपयोग कर एक से अधिक थ्रेड से बचाने:

- (void) streamingDataReceived:(StreamingData *)streamingData { 
    if (self.isStreaming) { 
     @synchronized(self) { 
      if (self.isStreaming) { 

- (void) stopStreaming { 
    if (self.isStreaming) { 
     @synchronized(self) { 
      if (self.isStreaming) { 

- (void) startStreaming:(NSArray *)watchlistInstrumentData { 
    if (!self.isStreaming) { 
     @synchronized(self) { 
      if (!self.isStreaming) { 

इस दोहरी जांच uneccessary है? क्या डबल चेक में जावा में उद्देश्य-सी में समान समस्याएं हैं? इस पैटर्न (विरोधी पैटर्न) के विकल्प क्या हैं।

धन्यवाद

उत्तर

2

यह भी उतना ही त्रुटिपूर्ण है - आप एक रेस स्थिति

आप अपने सिंक्रनाइज़ अनुभाग दर्ज करें और फिर झंडा

+0

क्या आप इस उत्तर को औचित्य दे सकते हैं? –

+0

आप विकल्पों के लिए सुझाव जोड़ने के लिए उत्तर का विस्तार कर सकते हैं। उदाहरण के लिए, उद्देश्य-सी में "क्षणिक" या परमाणु इंटेगर/आदि के बराबर है? –

0

जो मुझे करने के लिए समय से पहले अनुकूलन की तरह दिखता है की जाँच करने के लिए है है। क्या गलत है (उदाहरण के लिए)

- (void) startStreaming:(NSArray *)watchlistInstrumentData { 
     @synchronized(self) { 
      if (!self.isStreaming) { 
... 
+0

यदि आवश्यक नहीं था तो मैं सिंक्रनाइज़ ब्लॉक में प्रवेश करने की लागत से परहेज कर रहा था। – bandejapaisa

+0

यही मेरा मतलब है "समयपूर्व अनुकूलन"। सिंक्रनाइज़ किए गए ब्लॉक में प्रवेश करने की लागत के बारे में आप परवाह क्यों नहीं करेंगे जबतक कि आपने इसे प्रोफाइलर के साथ माप नहीं लिया था और यह काफी समय ले रहा था? – JeremyP

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