2011-09-16 11 views
5

Duplicar posible:
What is the Re-entrant lock and concept in general?¿Para qué se utiliza la reentrada de bloqueo en java?

estoy tratando de entender las cerraduras de reentrada en Java y estoy buscando una explicación sencilla. ¿Por qué es necesaria la reentrada de bloqueo? ¿Qué problema soluciona? Un escenario de ejemplo ayudaría.

+0

No es todo un duplicado. Esta pregunta es mucho más específica y se relaciona con algunas implementaciones específicas de bloqueo de Java. La otra pregunta es muy general. – Eddie

Respuesta

3

Un bloqueo de reentrada es uno que el mismo hilo puede adquirir más de una vez. Comúnmente, un bloqueo de reentrada se debe desbloquear la misma cantidad de veces que está bloqueado. Un bloqueo de reentrada suele ser mucho más fácil de codificar. Si tiene varios métodos donde A llama B y B llama a C ... pero el cliente de este código puede llamar a A, B o C, y si desea bloquear dentro de cada uno de estos métodos, entonces un bloqueo de reentrada resolverá su problema. Evitará que cualquier hilo que no sea uno a la vez acceda a este código, pero permitirá múltiples adquisiciones de bloqueo para que no se bloquee usted mismo.

Digamos que usted tiene esto:

public class SyncTest { 
    private final Lock lock = new ReentrantLock(); 
    public void doA() { 
    lock.lock(); 
    try { 
     doB(); 
     doSomethingForA(); 
    } finally { 
     lock.unlock(); 
    } 
    } 

    public void doB() { 
    lock.lock(); 
    try { 
     doC(); 
     doSomethingForB(); 
    } finally { 
     lock.unlock(); 
    } 
    } 

    public void doC() { 
    lock.lock(); 
    try { 
     doSomeWorkThatEveryoneDoes(); 
    } finally { 
     lock.unlock(); 
    } 
    } 
} 

donde otro código puede llamar a cualquiera de doA o doB o doC y todos ellos sincronizar alrededor de un poco de trabajo utilizando la misma cerradura. El bloqueo utilizado es "reentrante" porque el mismo hilo puede adquirirlo varias veces. Si no se volvió a ingresar el bloqueo, cuando llame al doA, en el momento en que ingrese doB y trate de adquirir el candado, se bloqueará porque el candado ya es propiedad, aunque sea propiedad suya.

Un semáforo de conteo puro inicializado en un contador de uno, por ejemplo, es un bloqueo no reentrante. Si el mismo subproceso intenta adquirirlo dos veces, se bloqueará para siempre en una especie de punto muerto.

Cuestiones relacionadas