¿Hay un código de muestra en el que @synchronized se bloqueará?
Frecuentes
Visto 895 veces
2
Realmente no puedo pensar en ninguna
Una cosa que puedo pensar es
@synchronized (self)
{
@synchronized (self){}
}
Pero esto no se interbloqueará porque el bloqueo es recursivo y solo permitirá que pase el mismo hilo. Entonces, básicamente, no puede bloquearse si para todo el programa solo usa una variable
Otro en el que puedo pensar es
@synchronized (A)
{
@synchronized (B){}
}
en un hilo y
@synchronized (B)
{
@synchronized (A){}
}
en otro. ¿Estoy en lo correcto aquí?
¿Cómo evitar el punto muerto entonces? ¿Alguna regla simple?
2 Respuestas
4
Mi regla n. ° 1 nunca bloquea nada que sea públicamente visible.
Mi regla número 2 es nunca llamar a un código externo mientras se mantiene un candado.
Descubrí que si puede administrar estos dos puntos, cualquier punto muerto que pueda surgir es mucho más fácil de detectar y solucionar.
contestado el 22 de mayo de 12 a las 17:05
1
Nada es simple cuando se usa la concurrencia donde hay recursos compartidos; siempre existe el riesgo de interbloqueo, siempre el riesgo de corrupción de datos a través de la falta de atomicidad, y siempre el riesgo de que el código habilitado totalmente concurrente sea más lento que el código de subproceso único debido a todo el bloqueo.
El "mejor" patrón es el aislamiento; haga que la capa de subprocesos cruzados/cola sea lo más pequeña posible y aísle todo lo que hay detrás en un solo subproceso.
Core Data es un buen ejemplo de este patrón. Los contextos de objetos administrados son por subproceso y CD administra el almacenamiento de datos simultáneo completamente entre bastidores a través de una parte de infraestructura excepcionalmente probada por unidad.
contestado el 22 de mayo de 12 a las 17:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas objective-c multithreading xcode4.3 grand-central-dispatch synchronized or haz tu propia pregunta.
Mi regla es usar solo uno y solo 1 candado y que sea visible para todos. Esta es otra buena regla. - user4951