framework español objective-c ios cocoa-touch

objective c - español - ¿Qué hace @synchronized()?



cocoa touch español (6)

Acabo de crear un método singleton, y me gustaría saber qué hace la función @synchronized() , ya que la uso con frecuencia, pero no conozco el significado.


De la documentación de Apple here y here :

La directiva @synchronized es una forma conveniente de crear bloqueos mutex sobre la marcha en código Objective-C. La directiva @synchronized hace lo mismo que cualquier otro bloqueo mutex: evita que diferentes hilos adquieran el mismo bloqueo al mismo tiempo.

La documentación proporciona una gran cantidad de información sobre este tema. Vale la pena tomarse el tiempo para leerlo, especialmente dado que lo has estado usando sin saber lo que está haciendo.


Declara una sección crítica alrededor del bloque de código. En el código multiproceso, @synchronized garantiza que solo un hilo puede ejecutar ese código en el bloque en cualquier momento dado.

Si no está al tanto de lo que hace, entonces su aplicación probablemente no es multiproceso, y probablemente no necesite usarla (especialmente si el singleton no es seguro para subprocesos).

Editar: Agregar más información que no estaba en la respuesta original de 2011.

La directiva @synchronized impide que varios subprocesos entren en cualquier región de código que esté protegida por una directiva @synchronized que se refiera al mismo objeto . El objeto que se pasa a la directiva @synchronized es el objeto que se usa como "bloqueo". Dos hilos pueden estar en la misma región protegida de código si se usa un objeto diferente como el bloqueo, y también puede proteger dos regiones de código completamente diferentes usando el mismo objeto que el candado.

Además, si pasa nil como objeto de bloqueo, no se realizará ningún bloqueo.



La directiva @synchronized es una forma conveniente de crear bloqueos mutex sobre la marcha en código Objective-C .

La directiva @synchronized hace lo mismo que cualquier otro bloqueo mutex: evita que diferentes hilos adquieran el mismo bloqueo al mismo tiempo.

Sintaxis:

@synchronized(key) { // thread-safe code }

Ejemplo:

-(void)AppendExisting:(NSString*)val { @synchronized (oldValue) { [oldValue stringByAppendingFormat:@"-%@",val]; } }

Ahora el código anterior es perfectamente seguro para hilos. Ahora varios hilos pueden cambiar el valor.

Lo anterior es solo un ejemplo oscuro ...


@synchronized es thread safe mecanismo thread safe . La pieza de código escrita dentro de esta función se convierte en la parte de critical section , a la que solo se puede ejecutar un hilo a la vez.

@synchronize aplica el bloqueo implícitamente mientras que NSLock aplica explícitamente.

Solo asegura la seguridad del hilo, no garantiza eso. Lo que quiero decir es que contratas un conductor experto para tu auto, pero no garantiza que el auto no sufra un accidente. Sin embargo, la probabilidad sigue siendo la más mínima.


El bloque @synchronized maneja automáticamente el bloqueo y desbloqueo por usted . @synchronize tiene un bloqueo implícito asociado con el objeto que está utilizando para sincronizar. Aquí hay una discusión muy informativa sobre este tema. ¿Cómo funciona @synchronized lock / unlock en Objective-C?