¿Hay un código de muestra en el que @synchronized se bloqueará?

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?

preguntado el 22 de mayo de 12 a las 17:05

2 Respuestas

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

Mi regla es usar solo uno y solo 1 candado y que sea visible para todos. Esta es otra buena regla. - user4951

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 or haz tu propia pregunta.