2010-06-07 9 views
5

Ich erkannte, dass die doppelte Überprüfung in Java aufgrund des Speichermodells fehlerhaft ist, aber das ist normalerweise mit dem Singleton-Muster verbunden und optimiert die Erstellung des Singleton.double checked locking - objectiv c

Was ist unter diesem Fall in Objective-C:

Ich habe einen boolean-Flag, um zu bestimmen, ob meine Anwendungsdaten gestreamt oder nicht. Ich habe 3 Methoden, startStreaming, stopStreaming, streamingDataReceived und ich sie von mehreren Threads schütze Verwendung:

- (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) { 

Ist das überprüfen uneccessary? Hat die Doppelprüfung in objective-c ähnliche Probleme wie in Java? Was sind die Alternativen zu diesem Muster (Anti-Pattern).

Dank

Antwort

2

Es gleichermaßen fehlerhaft ist - haben Sie eine Race-Bedingung

Sie haben Ihre synchronisierten Abschnitt eingeben und dann die Flagge überprüfen

+0

Können Sie diese Antwort begründen? –

+0

Sie können die Antwort erweitern, um Vorschläge für Alternativen hinzuzufügen. Gibt es zum Beispiel in Objective-C ein Äquivalent zu "transient" oder AtomicInteger/etc? –

0

Das ist für mich wie vorzeitige Optimierung aussieht. Was ist los mit (zum Beispiel)

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

Ich habe die Kosten für die Eingabe des synchronisierten Blocks vermieden, wenn es nicht notwendig war. – bandejapaisa

+0

Das meinte ich mit "vorschneller Optimierung". Warum sollten Sie sich um die Kosten für die Eingabe des synchronisierten Blocks kümmern, es sei denn, Sie haben es mit einem Profiler gemessen und es hat viel Zeit in Anspruch genommen? – JeremyP