¿Qué hace @synchronized ()?

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.

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 “locking”. Dos hilos pueden estar en la misma región protegida de código si se usa un objeto diferente como el locking, 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 locking, no se realizará ningún locking.

De la documentación de Apple aquí y aquí :

La directiva @synchronized es una forma conveniente de crear lockings mutex sobre la marcha en código Objective-C. La directiva @synchronized hace lo mismo que cualquier otro locking mutex: evita que diferentes hilos adquieran el mismo locking 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.

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

La directiva @synchronized hace lo mismo que cualquier otro locking mutex: evita que diferentes hilos adquieran el mismo locking 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 …

El bloque @synchronized maneja automáticamente el locking y deslocking por usted . @synchronize tiene un locking 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?

Excelente respuesta aquí:

Ayuda a entender el método de clase devolviendo singleton

con una explicación más detallada del proceso de creación de un singleton.

@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 locking 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.