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.
fuente
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.
Declara una sección crítica alrededor del bloque de código. En código multiproceso, @synchronizedgarantiza 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 @synchronizeddirectiva evita que varios subprocesos entren en cualquier región de código que esté protegida por una @synchronizeddirectiva que haga referencia al mismo objeto . El objeto que se pasa a la @synchronizeddirectiva 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 nilcomo el objeto de bloqueo, no se tomará ningún bloqueo.
@synchronizedél, no hace nada, queda desprotegido. 2)@synchronizedes lento .@synchronized.De la documentación de Apple aquí y aquí :
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.
fuente
La
@synchronizeddirectiva es una forma conveniente de crear bloqueos mutex sobre la marcha en el código Objective-C .los
@synchronizeddirectiva 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 ...
fuente
@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?
fuente
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.
fuente
@synchronizedesthread safemecanismo. El fragmento de código escrito dentro de esta función se convierte en parte de lacritical sectionque solo se puede ejecutar un hilo a la vez.@synchronizeaplica el bloqueo implícitamente mientras que loNSLockaplica 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.
fuente