¿Qué ventaja (s) tiene dispatch_sync sobre @synchronized?

Digamos que quiero hacer este código seguro para subprocesos:

- (void) addThing:(id)thing { // Can be called from different threads
    [_myArray addObject:thing];
}

GCD parece ser la forma preferida de lograr esto:

- (void) addThing:(id)thing { 
    dispatch_sync(_myQueue, ^{  // _myQueue is serial.
        [_myArray addObject:thing];
    });    
}

¿Qué ventaja (s) tiene sobre el método tradicional?

- (void) addThing:(id)thing {
    @synchronized(_myArray) {
        [_myArray addObject:thing];
    }
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta