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 sé el significado.
Respuestas:
Declara una sección crítica alrededor del bloque de código. En código multiproceso, @synchronized
garantiza que solo un subproceso pueda ejecutar ese código en el bloque en un momento dado.
Si no sabe lo que hace, entonces su aplicación probablemente no sea multiproceso y probablemente no necesite usarla (especialmente si el singleton en sí no es seguro para subprocesos).
Editar: agregando más información que no estaba en la respuesta original de 2011.
La @synchronized
directiva evita que varios subprocesos entren en cualquier región de código que esté protegida por una @synchronized
directiva que haga referencia al mismo objeto . El objeto que se pasa a la @synchronized
directiva es el objeto que se utiliza como "bloqueo". Dos subprocesos pueden estar en la misma región de código protegida si se usa un objeto diferente como bloqueo, y también puede proteger dos regiones de código completamente diferentes usando el mismo objeto que el bloqueo.
Además, si pasa nil
como el objeto de bloqueo, no se tomará ningún bloqueo.
@synchronized
.
De la documentación de Apple aquí y aquí :
La directiva @synchronized es una forma conveniente de crear bloqueos mutex sobre la marcha en el código Objective-C. La directiva @synchronized hace lo que haría cualquier otro bloqueo mutex: evita que diferentes subprocesos 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 ha estado usando sin saber lo que hace.
La @synchronized
directiva es una forma conveniente de crear bloqueos mutex sobre la marcha en el código Objective-C .
los @synchronized
directiva hace lo que haría cualquier otro bloqueo mutex: evita que diferentes subprocesos 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 subprocesos ... Ahora varios subprocesos pueden cambiar el valor.
Lo anterior es solo un oscuro ejemplo ...
@synchronized(val, oldValue) { ... }
?
@synchronized block maneja automáticamente el bloqueo y desbloqueo por usted . @synchronize tienes un bloqueo implícito asociado con el objeto que estás usando para sincronizar. Aquí hay una discusión muy informativa sobre este tema, siga ¿Cómo se bloquea / desbloquea @synchronized en Objective-C?
Excelente respuesta aquí:
Ayuda a comprender el método de clase que devuelve singleton
con una explicación más detallada del proceso de creación de un singleton.
@synchronized
es thread safe
mecanismo. El fragmento de código escrito dentro de esta función se convierte en parte de la critical section
que solo se puede ejecutar un hilo a la vez.
@synchronize
aplica el bloqueo implícitamente mientras que lo NSLock
aplica explícitamente.
Solo asegura la seguridad del hilo, no garantiza eso. Lo que quiero decir es que contrata a un conductor experto para su automóvil, pero eso no garantiza que el automóvil no sufra un accidente. Sin embargo, la probabilidad sigue siendo la más mínima.
@synchronized
él, no hace nada, queda desprotegido. 2)@synchronized
es lento .