2010-06-07 9 views
5

Ho capito che il blocco a doppio controllo è imperfetto in java a causa del modello di memoria, ma di solito è associato al modello singleton e all'ottimizzazione della creazione del singleton.blocco a doppia verifica - obiettivo c

Che dire in questo caso in Objective-C:

Ho un flag booleano per determinare se la mia domanda è in streaming di dati o meno. Ho 3 metodi, startStreaming, stopStreaming, streamingDataReceived e proteggo loro di più thread utilizzando:

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

È questo il doppio controllo uneccessary? Il doppio controllo ha problemi simili nell'obiettivo-c come in java? Quali sono le alternative a questo modello (anti-pattern).

Grazie

risposta

2

E 'altrettanto difettosa - si ha una condizione di competizione

Dovete Entra nella sezione sincronizzato e quindi controllare la bandiera

+0

Puoi giustificare questa risposta? –

+0

È possibile estendere la risposta per aggiungere suggerimenti per alternative. Ad esempio, esiste un equivalente a "transiente" o AtomicInteger/etc in Objective-C? –

0

Che assomiglia ottimizzazione prematura per me. Cosa c'è di sbagliato con (per esempio)

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

Stavo evitando il costo di inserimento del blocco sincronizzato se non era necessario. – bandejapaisa

+0

Ecco cosa intendevo per "ottimizzazione prematura". Perché ti interesserebbe il costo di inserire il blocco sincronizzato a meno che non lo avessi misurato con un profiler e ci fosse voluto molto tempo? – JeremyP