2012-05-08 16 views

Respuesta

9

Como ha formulado la pregunta, ambas declaraciones son equivalentes como una cuestión de estrategia de seguridad de simultaneidad.

Dependiendo de la escala y de lo lejos que haya completado el trabajo en su proyecto, es posible que desee considerar una estrategia alternativa para la seguridad de subprocesos.

Recientemente, Apple ha recomendado recomendar la seguridad de subprocesos por serialización en lugar del bloqueo tradicional. En resumen, a medida que aumenta la disputa, el acceso serializado es mucho más eficiente que el bloqueo con @synchronize.

En lugar de sincronizar, considere configurar una cola en serie GCD y hacer cola de acceso a los recursos compartidos entre subprocesos.

+0

O, mejor, utilice el patrón de lector-escritor, una cola concurrente de GCD, realice lecturas con 'dispatch_sync' y escriba con' dispatch_barrier_async'. – Rob

10

El uso de @syncrhonized(obj) solo forma un bloqueo para que la sincronización de otros códigos en obj no se ejecute al mismo tiempo.

Las propiedades atómicas funcionan al no permitir que se realicen cambios mientras se accede a una propiedad; proporcionan bloqueo implícito para el acceso.

array = someObject.array; //locked 
[array doSomething];  //no longer locked 

No se puede sustituir los captadores y definidores de atomic propiedades, pero usando la directiva @sycnronized alrededor del captador/definidor debe ser suficiente.

Honestamente, a menos que esté haciendo una programación seriamente multiproceso, las propiedades atómicas son innecesarias y solo causan golpes de rendimiento.

+1

Claramente, los ejemplos de los getters y setters que emplean '@ synchronized' están muy lejos de la seguridad de los hilos y por lo tanto uno casi nunca aplicaría este patrón. Uno a menudo tiene que realizar la sincronización a un nivel más alto para realizar la seguridad del hilo. – Rob

Cuestiones relacionadas