2011-09-16 7 views
5

Eventuali duplicati:
What is the Re-entrant lock and concept in general?A cosa serve la riorganizzazione della serratura in java?

Sto cercando di capire le serrature rientranti in Java e Cerco una semplice spiegazione. Perché è necessario il rientro della serratura? Che problema risolve? Uno scenario di esempio potrebbe aiutare.

+0

Non proprio un duplicato. Questa domanda è molto più specifica e riguarda alcune specifiche implementazioni del blocco Java. L'altra domanda è molto generale. – Eddie

risposta

3

Un blocco di rientro è uno che la stessa thread può acquisire più di una volta. Comunemente, un blocco rientro deve essere sbloccato lo stesso numero di volte in cui è bloccato. Un blocco di rientro è spesso molto più facile da codificare. Se hai diversi metodi in cui A chiama B e B chiama C ... ma il client di questo codice può chiamare in A o B o C, e se vuoi bloccare all'interno di ciascuno di questi metodi, allora un blocco di rientro risolverà il tuo problema. Impedirà l'accesso a questo codice a thread diversi da uno alla volta, ma consentirà l'acquisizione di più lock in modo da non bloccarsi.

Diciamo che hai questo:

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(); 
    } 
    } 
} 

dove altro codice può chiamare uno dei doA o doB o doC e tutti loro sincronizzare intorno po 'di lavoro con lo stesso blocco. Il blocco utilizzato è "rientrante" in quanto lo stesso thread può acquisirlo più volte. Se la serratura non è rientrante, quando chiami doA, nel momento in cui inserisci doB e provi ad acquisire il blocco, sarai bloccato perché il blocco è già in possesso, anche se è di tua proprietà.

Un semaforo di conteggio puro inizializzato a un conteggio di uno, ad esempio, è un blocco non rientranti. Se lo stesso thread tenta di acquisirlo due volte, bloccherà per sempre in una sorta di auto-deadlock.