2010-06-07 43 views
5

Me di cuenta de doble bloqueo comprobado es defectuoso en Java debido al modelo de memoria, pero que generalmente se asocia con el patrón de singleton y la optimización de la creación del singleton.doble bloqueo bloqueado - objetivo c

¿Qué pasa con bajo este caso en Objective-C:

Tengo un indicador booleano para determinar si mi solicitud está transmitiendo datos o no. Tengo 3 métodos, startStreaming, stopStreaming, streamingDataReceived y protejo a ellos desde varios subprocesos usando:

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

¿Es esta doble verificación uneccessary? ¿La doble verificación tiene problemas similares en Object-C como en Java? ¿Cuáles son las alternativas a este patrón (antipatrón)?

Gracias

Respuesta

2

Es igualmente errónea - que tienen una condición de carrera

tiene que introducir su sección sincronizado y compruebe el indicador

+0

¿Puedes justificar esta respuesta? –

+0

Puede ampliar la respuesta para agregar sugerencias de alternativas. Por ejemplo, ¿hay un equivalente a "transitorio" o AtomicInteger/etc en Objective-C? –

0

que se parece a la optimización prematura a mí. ¿Qué ocurre con (por ejemplo)

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

Estaba evitando el costo de ingresar al bloque sincronizado si no fuera necesario. – bandejapaisa

+0

Eso es lo que quise decir con "optimización prematura". ¿Por qué le importaría el costo de ingresar al bloque sincronizado a menos que lo haya medido con un generador de perfiles y que le haya tomado una cantidad significativa de tiempo? – JeremyP