2012-01-30 12 views

Respuesta

0

Siempre he pensado en la sincronización como "el truco de la menor resistencia". Simplemente funciona y la mayoría de las personas entienden cómo funciona, pero tiene algunas debilidades que podrían afectar su diseño bajo una fuerte concurrencia. No menos importante es que cualquier cliente tiene acceso directo al bloqueo de sincronización de su objeto, lo que significa que si lo agarra y lo mantiene, otros clientes no podrán. En otras palabras, el bloqueo implementado por sincronización predeterminada efectivamente "publica" el mecanismo de bloqueo interno de su objeto. Yuk. Es como prepararse para la denegación de servicio autoinfligida.

Si hace que el bloqueo de reentrada sea interno para su clase (o simplemente no use el sincronizado pero haga algo como sincronizar en algún objeto interno que actualice en su constructor donde quiera que esté sincronizado), quite este lado - El efecto de publicar su mecanismo interno de bloqueo, con la complejidad adicional de tener que recordar dónde aplicar esta sincronización interna a medida que su clase evoluciona.

+0

"cualquier cliente tiene acceso directo al bloqueo de sincronización de su objeto" solo si aplica el modificador 'synchronized' a un método accesible, no si usa un bloque' synchronized' en un objeto de bloqueo inaccesible. – Raedwald

+0

Sí. Eso es lo que dije. Si usa la palabra clave sincronizada predeterminada en sus métodos, estará publicando efectivamente sus bloqueos. Para evitar esto, haga que el bloque sincronizado sea interno. –

21

A ReentrantLock es:

A reentrante exclusión mutua de bloqueo con el mismo comportamiento básico y semántica que la cerradura implícita del monitor accede usando sincronizados métodos y declaraciones, pero con las capacidades extendidas.

capacidades extendidas incluyen:

  1. La capacidad de tener más de un condition variable por monitor. Los monitores que usan la palabra clave sincronizada solo pueden tener uno. Esto significa que los bloqueos reentrantes admiten más de una cola wait()/notify().
  2. La capacidad de hacer la cerradura fair. Los bloques sincronizados son injustos.

    "[fair] bloqueos favorecen el acceso al hilo de espera más larga. De lo contrario, este bloqueo no garantiza ninguna orden de acceso particular."

  3. La capacidad de verificar si el bloqueo se está reteniendo.
  4. La capacidad de obtener la lista de hilos esperando en el candado.

Las desventajas de las cerraduras de reentrada son:

  1. necesidad de añadir la declaración de importación.
  2. Es necesario cerrar las adquisiciones de bloqueo en un bloque try/finally. Esto lo hace más feo que la palabra clave sincronizada.
  3. La palabra clave synchronized se puede poner en las definiciones de métodos, lo que evita la necesidad de un bloque que reduzca la anidación.

Resumen

La palabra clave synchronized es sintácticamente más agradable, pero la cerradura Reentrante tiene más características.

0

Este sitio menciona claramente la diferencia entre ReentrantLock y la palabra clave sincronizada en Java. Yo solo copio y pego desde allí.

http://javarevisited.blogspot.in/2013/03/reentrantlock-example-in-java-synchronized-difference-vs-lock.html

1) Otra diferencia significativa entre ReentrantLock y la palabra clave sincronizada es la equidad. la palabra clave sincronizada no es compatible con la equidad. Cualquier hilo puede adquirir el bloqueo una vez liberado, no se puede especificar ninguna preferencia, por otro lado puede hacer que ReentrantLock sea justo especificando la propiedad de equidad, mientras crea una instancia de ReentrantLock. La propiedad de equidad proporciona bloqueo al hilo de espera más largo, en caso de conflicto.

2) La segunda diferencia entre el bloqueo sincronizado y Reentrant es el método tryLock(). ReentrantLock proporciona el conveniente método tryLock(), que adquiere el bloqueo solo si está disponible o no en otro hilo. Esto reduce el bloqueo del hilo esperando el bloqueo en la aplicación Java.

3) Una diferencia más que vale la pena destacar entre ReentrantLock y la palabra clave sincronizada en Java es la capacidad de interrumpir el hilo mientras se espera el bloqueo. En el caso de la palabra clave sincronizada, un hilo se puede bloquear esperando el bloqueo, por un período de tiempo indefinido y no había forma de controlarlo. ReentrantLock proporciona un método llamado lockInterruptibly(), que se puede usar para interrumpir el hilo cuando está esperando el bloqueo. De manera similar, tryLock() con tiempo de espera se puede usar para agotar el tiempo de espera si el bloqueo no está disponible en un determinado período de tiempo.

4) ReentrantLock también proporciona un método conveniente para obtener la lista de todos los hilos esperando el bloqueo.

Cuestiones relacionadas