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.¿Qué hace @synchronized()?
Respuesta
Declara critical section 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 tiene conocimiento de lo que hace, entonces su aplicación probablemente no es multihilo, y probablemente no necesite usarla (especialmente si el singleton no es seguro para subprocesos).
Editar: Adición de mayor información que no estaba en la respuesta original a partir de 2011.
La Directiva @synchronized
prevents multiple threads from entering any region of code that is protected by a @synchronized
directive referring to the same object. El objeto que se pasa a la directiva @synchronized
es el objeto que se utiliza 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.
Un par de puntos importantes: 1) Si usa un puntero nulo en '@ synchronized', no hace nada; quedará desprotegido. 2) '@ sincronizado' es * lento *. –
Esta respuesta es engañosa y no debe ser la respuesta aceptada. Aunque lo que dice a veces sería correcto (siempre que el token pasado a * synhronized * sea el mismo objeto en todos los hilos), es engañosamente incompleto. * sincronizado * impide que se ejecute al mismo tiempo cualquier cantidad de secciones de código asociadas, no solo "ese código en el bloque". El parámetro * * synchronized * determina de manera efectiva qué secciones de código (o "bloques", como la llama la respuesta) están protegidas contra el acceso concurrente. – Arda
@Arda Tienes toda la razón. He agregado un poco más de información y un enlace a cierta documentación de Apple sobre '@ synchronized'. –
A partir de la documentación de Apple here y here:
La directiva @synchronized es una manera conveniente para crear bloqueos mutex sobre la marcha en el código Objective-C. La Directiva @synchronized hace lo que cualquier otra bloqueo mutex haría-previene hilos diferentes de la adquisición de la misma 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.
@synchronized block se encarga automáticamente de bloquear y desbloquear. @synchronize tiene un bloqueo implícito asociado con el objeto que está utilizando para sincronizar. Aquí es muy informativo discusión sobre este tema, por favor siga How does @synchronized lock/unlock in Objective-C?
excelente respuesta aquí:
Help understanding class method returning singleton
con una explicación más detallada del proceso de creación de un producto único.
La directiva @synchronized
es una manera 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 thread safe..Now múltiples hilos puede cambiar el valor.
Lo anterior es sólo un ejemplo oscura ...
¿No debería ser @synchronized (oldValue)? – Joel
O incluso '@synchronized (val, oldValue) {...}'? –
No estoy seguro de haber visto algún esquema que sea "perfectamente seguro para subprocesos". Por lo menos, necesitas saber lo que estás haciendo y no solo copiar ciegamente código de algún lado. –
@synchronized
es thread safe
mecanismo. 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
lo aplica explícitamente.
Solo garantiza 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.
Esto es absolutamente incorrecto. dispatch_once NO hace lo mismo que @syncrhonized, puede ser un sustituto SÓLO bajo la asignación de un singleton. – jugutier
- 1. ¿Qué hace synchronized()/wait()/notifyAll() en Java?
- 2. pthread_mutex_t VS @synchronized block?
- 3. ¿Cuál es la diferencia entre synchronized (this) y synchronized (ClassName.class)?
- 4. "synchronized (this)" vs. "synchronized ((BaseClass) this)" en Java?
- 5. @synchronized() y NSLock diferencias
- 6. @synchronized vs GCD dispatch_barrier_async
- 7. @synchronized en un método estático
- 8. Mike Ash Singleton: Colocación @synchronized
- 9. ¿Por qué `this.synchronized` en lugar de simplemente` synchronized` en Scala?
- 10. objetivo-c: @synchronized, ¿cómo funciona?
- 11. ¿Qué hace sincronizado en un método estático?
- 12. ¿Qué hace [:]?
- 13. ¿Por qué hace esto lo que hace?
- 14. @synchronized vs NSLock Instancia vs pthread_mutex_t
- 15. ¿Qué hace CreateFile ("CONIN $" ..)?
- 16. DefaultMemberAttribute: ¿qué hace?
- 17. ¿Qué hace document.domain = document.domain?
- 18. ¿Qué hace un IISReset?
- 19. ¿Qué hace "mro()"?
- 20. ¿Qué hace sp_tablecollations_100?
- 21. ¿Qué hace esta función?
- 22. ¿Qué hace "file.sync = true"?
- 23. ¿Qué hace pg_escape_string exactamente?
- 24. ¿Qué hace testAndroidTestCaseSetUpProlyly
- 25. ¿Qué hace L?
- 26. ¿Qué hace "<%:" hacer?
- 27. ¿Qué hace realmente BlockingCollection.Dispose?
- 28. ¿Qué hace HTML.Raw?
- 29. HttpWebRequest.UserAgent: ¿Qué hace?
- 30. DataGridView: ¿qué hace AllowUserToAddRows?
Posible duplicado de http://stackoverflow.com/q/6234344/277952? – NSGod